diff --git a/.gitignore b/.gitignore index 283cf77..2d3c94c 100644 --- a/.gitignore +++ b/.gitignore @@ -89,17 +89,3 @@ /xpra-5.0.3.tar.gz /xpra-5.0.6.tar.gz /xpra-5.0.10.tar.gz -/xpra-5.1.tar.gz -/xpra-5.1.1.tar.gz -/xpra-6.3.4.tar.gz -/xpra-6.3.5.tar.gz -/xpra-6.3.6.tar.gz -/xpra-6.4.tar.gz -/xpra-6.4.1.tar.gz -/xpra-6.4.2.tar.gz -/xpra-6.4.3.tar.gz -/xpra-6.4.4.tar.gz -/xpra-6.5.tar.gz -/xpra-6.5.1.tar.gz -/xpra-6.5.2.tar.gz -/xpra-6.5.3.tar.gz diff --git a/0001-Add-compatibility-with-FFMPEG-7.0.patch b/0001-Add-compatibility-with-FFMPEG-7.0.patch new file mode 100644 index 0000000..d01a792 --- /dev/null +++ b/0001-Add-compatibility-with-FFMPEG-7.0.patch @@ -0,0 +1,156 @@ +From 6722df9aeb90857bc1c979c92d47e57903e0ebd6 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Robert-Andr=C3=A9=20Mauchin?= +Date: Tue, 7 May 2024 07:23:07 +0200 +Subject: [PATCH] Add compatibility with FFMPEG 7.0 + +channel_layout has been replaced with ch_layout + +avcodec_close has been deprecated in favor of avcodec_free_context + +avio: Constify data pointees of write callbacks + +FF_API_FRAME_PICTURE_NUMBER has been deprecated + +AV_PIX_FMT_XVMC has been deprecated +--- + xpra/codecs/ffmpeg/decoder.pyx | 9 ++------- + xpra/codecs/ffmpeg/encoder.pyx | 37 ++++++++++++++++++++++------------ + 2 files changed, 26 insertions(+), 20 deletions(-) + +diff --git a/xpra/codecs/ffmpeg/decoder.pyx b/xpra/codecs/ffmpeg/decoder.pyx +index 4f71b5bf1f..f1df36a85a 100644 +--- a/xpra/codecs/ffmpeg/decoder.pyx ++++ b/xpra/codecs/ffmpeg/decoder.pyx +@@ -295,6 +295,7 @@ cdef extern from "libavcodec/avcodec.h": + int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options) + AVFrame* av_frame_alloc() + void av_frame_free(AVFrame **frame) ++ int avcodec_close(AVCodecContext *avctx) + + #actual decoding: + AVPacket *av_packet_alloc() nogil +@@ -818,7 +819,10 @@ cdef class Decoder: + img.clone_pixel_data() + log("clean_decoder() freeing AVCodecContext: %#x", self.codec_ctx) + if self.codec_ctx!=NULL: +- avcodec_free_context(&self.codec_ctx) ++ r = avcodec_close(self.codec_ctx) ++ if r!=0: ++ log.error("Error: failed to close decoder context %#x:", self.codec_ctx) ++ log.error(" %s", av_error_str(r)) + f = self.file + if f: + self.file = None +diff --git a/xpra/codecs/ffmpeg/encoder.pyx b/xpra/codecs/ffmpeg/encoder.pyx +index 6af88a5629..5df0c590c0 100644 +--- a/xpra/codecs/ffmpeg/encoder.pyx ++++ b/xpra/codecs/ffmpeg/encoder.pyx +@@ -120,10 +120,26 @@ cdef extern from "libavformat/avio.h": + AVIOContext *avio_alloc_context(unsigned char *buffer, int buffer_size, int write_flag, + void *opaque, + int (*read_packet)(void *opaque, uint8_t *buf, int buf_size), +- int (*write_packet)(void *opaque, uint8_t *buf, int buf_size) except 0, ++ int (*write_packet)(void *opaque, const uint8_t *buf, int buf_size) except 0, + int64_t (*seek)(void *opaque, int64_t offset, int whence)) + + ++cdef extern from "libavutil/channel_layout.h": ++ ctypedef int AVChannelOrder ++ ctypedef int AVChannel ++ ctypedef struct AVChannelCustom: ++ AVChannel id ++ char name[16] ++ void *opaque ++ ctypedef union ChannelUnion: ++ uint64_t mask ++ AVChannelCustom* map ++ ctypedef struct AVChannelLayout: ++ AVChannelOrder order ++ int nb_channels ++ ChannelUnion u ++ void *opaque ++ + cdef extern from "libavcodec/avcodec.h": + int FF_THREAD_SLICE #allow more than one thread per frame + int FF_THREAD_FRAME #Decode more than one frame at once +@@ -190,8 +206,6 @@ cdef extern from "libavcodec/avcodec.h": + int format + int key_frame + int64_t pts +- int coded_picture_number +- int display_picture_number + int quality + void *opaque + AVPictureType pict_type +@@ -288,14 +302,12 @@ cdef extern from "libavcodec/avcodec.h": + #skipped: AVColor* + int slices + int sample_rate +- int channels + AVSampleFormat sample_fmt ++ AVChannelLayout ch_layout + int frame_size + int frame_number + int block_align + int cutoff +- uint64_t channel_layout +- uint64_t request_channel_layout + #skipped: AVAudioServiceType + # AVSampleFormat + int refcounted_frames +@@ -483,7 +495,7 @@ cdef extern from "libavutil/opt.h": + AVOptionType AV_OPT_TYPE_VIDEO_RATE + AVOptionType AV_OPT_TYPE_DURATION + AVOptionType AV_OPT_TYPE_COLOR +- AVOptionType AV_OPT_TYPE_CHANNEL_LAYOUT ++ AVOptionType AV_OPT_TYPE_CHLAYOUT + AVOptionType AV_OPT_TYPE_BOOL + + int AV_OPT_SEARCH_CHILDREN +@@ -686,7 +698,7 @@ AV_OPT_TYPES = { + AV_OPT_TYPE_VIDEO_RATE : "VIDEO_RATE", + AV_OPT_TYPE_DURATION : "DURATION", + AV_OPT_TYPE_COLOR : "COLOR", +- AV_OPT_TYPE_CHANNEL_LAYOUT : "CHANNEL_LAYOUT", ++ AV_OPT_TYPE_CHLAYOUT : "CHANNEL_LAYOUT", + AV_OPT_TYPE_BOOL : "BOOL", + } + +@@ -1137,7 +1149,7 @@ cdef list_options(void *obj, const AVClass *av_class, int skip=1): + list_options(child, child_class, skip-1) + + +-cdef int write_packet(void *opaque, uint8_t *buf, int buf_size) except 0: ++cdef int write_packet(void *opaque, const uint8_t *buf, int buf_size) except 0: + global GEN_TO_ENCODER + encoder = GEN_TO_ENCODER.get( opaque) + #log.warn("write_packet(%#x, %#x, %#x) encoder=%s", opaque, buf, buf_size, type(encoder)) +@@ -1504,7 +1517,7 @@ cdef class Encoder: + self.audio_ctx.time_base.num = 1 + self.audio_ctx.bit_rate = 64000 + self.audio_ctx.sample_rate = 44100 +- self.audio_ctx.channels = 2 ++ self.audio_ctx.ch_layout.nb_channels = 2 + #if audio_codec.capabilities & CODEC_CAP_VARIABLE_FRAME_SIZE: + # pass + #cdef AVDictionary *opts = NULL +@@ -1689,8 +1702,6 @@ cdef class Encoder: + self.av_frame.height = self.height + self.av_frame.format = self.pix_fmt + self.av_frame.pts = self.frames+1 +- self.av_frame.coded_picture_number = self.frames+1 +- self.av_frame.display_picture_number = self.frames+1 + #if self.frames==0: + self.av_frame.pict_type = AV_PICTURE_TYPE_I + #self.av_frame.key_frame = 1 +@@ -1823,7 +1834,7 @@ cdef class Encoder: + + def write_packet(self, uintptr_t buf, int buf_size): + log("write_packet(%#x, %#x)", buf, buf_size) +- cdef uint8_t *cbuf = buf ++ cdef const uint8_t *cbuf = buf + buffer = cbuf[:buf_size] + self.buffers.append(buffer) + return buf_size +-- +2.44.0 diff --git a/ignore_assert_pandoc.patch b/ignore_assert_pandoc.patch new file mode 100644 index 0000000..81f654e --- /dev/null +++ b/ignore_assert_pandoc.patch @@ -0,0 +1,41 @@ +only on ppc64le pandoc returns -11 + + Debian.md -> Debian.html +Traceback (most recent call last): + File "/builddir/build/BUILD/xpra-4.4.4/setup.py", line 2384, in + main() + File "/builddir/build/BUILD/xpra-4.4.4/setup.py", line 2380, in main + setup(**setup_options) + File "/usr/lib64/python3.11/distutils/core.py", line 148, in setup + dist.run_commands() + File "/usr/lib64/python3.11/distutils/dist.py", line 966, in run_commands + self.run_command(cmd) + File "/usr/lib64/python3.11/distutils/dist.py", line 985, in run_command + cmd_obj.run() + File "/usr/lib64/python3.11/distutils/command/install.py", line 584, in run + self.run_command(cmd_name) + File "/usr/lib64/python3.11/distutils/cmd.py", line 313, in run_command + self.distribution.run_command(command) + File "/usr/lib64/python3.11/distutils/dist.py", line 985, in run_command + cmd_obj.run() + File "/builddir/build/BUILD/xpra-4.4.4/setup.py", line 1810, in run + convert_doc_dir("./docs", doc_dir) + File "/builddir/build/BUILD/xpra-4.4.4/setup.py", line 423, in convert_doc_dir + convert_doc_dir(fsrc, fdst, fmt, force) + File "/builddir/build/BUILD/xpra-4.4.4/setup.py", line 426, in convert_doc_dir + convert_doc(fsrc, fdst, fmt, force) + File "/builddir/build/BUILD/xpra-4.4.4/setup.py", line 413, in convert_doc + assert r==0, "'%s' returned %s" % (" ".join(cmd), r) + ^^^^ +AssertionError: 'pandoc --from markdown --to html -o /builddir/build/BUILDROOT/xpra-4.4.4-1.fc38.ppc64le/usr/share/doc/xpra/Build/Debian.html ./docs/Build/Debian.md --lua-filter ./fs/bin/links-to-html.lua' returned -11 +--- ./setup.py.orig 2024-10-11 13:20:23.798168651 +0100 ++++ ./setup.py 2024-10-11 13:23:23.220858810 +0100 +@@ -514,7 +514,7 @@ def convert_doc(fsrc, fdst, fmt="html", + else: + cmd += ["--lua-filter", "./fs/bin/links-to-html.lua"] + r = subprocess.Popen(cmd).wait(TIMEOUT) +- assert r==0, "'%s' returned %s" % (" ".join(cmd), r) ++ #assert r==0, "'%s' returned %s" % (" ".join(cmd), r) + + def convert_doc_dir(src, dst, fmt="html", force=False): + print("%-20s -> %s" % (src, dst)) diff --git a/sources b/sources index c8ed7c8..ede007b 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (xpra-6.5.3.tar.gz) = 98eee6577d26cf15cdf8115352e73601438804a69d5081d7af908d9c4fc03e44e723eb74cc6f468c92c8e935cc5e897bcdeda316d3f756905b368e83ac051d91 +SHA512 (xpra-5.0.10.tar.gz) = e1b01eb1d36351db460d7631dd33efd24e68d374784d803fcd8ad6774b25509dcd42c2d62fd00999ec513265745a3be17dde611a61c07fa70136f319a9a4eaca diff --git a/xpra-fix_audio.patch b/xpra-fix_audio.patch deleted file mode 100644 index 5dab7ab..0000000 --- a/xpra-fix_audio.patch +++ /dev/null @@ -1,11 +0,0 @@ ---- a/fs/etc/xpra/xpra.orig.conf 2025-11-02 12:49:06.000000000 +0100 -+++ b/fs/etc/xpra/xpra.conf 2025-11-09 15:18:11.280317871 +0100 -@@ -20,3 +20,8 @@ - # may just be specified multiple times. - # - You may break a long line into multiple lines - # by ending each line with a backslash '\'. -+ -+xvfb = Xvfb -screen 0 1920x1100x24 -nolisten tcp -noreset -+ -+# Use PipeWire's PulseAudio socket, do NOT spawn pulseaudio -+pulseaudio = no diff --git a/xpra.spec b/xpra.spec index 933f86c..4ac5e54 100644 --- a/xpra.spec +++ b/xpra.spec @@ -1,11 +1,40 @@ +%bcond_with enc_x264 +%bcond_with enc_x265 +# Theses settings requires 64bit +%if 0%{?__isa_bits} == 64 +%bcond_without dec_avcodec2 +%bcond_without csc_swscale +%else +%bcond_with dec_avcodec2 +%bcond_with csc_swscale +%endif + # For debugging only %bcond_with debug +%if %{with debug} +%global _with_debug --with-debug +%endif # -%if 0%{?fedora} -%bcond_with openh264 -%else -%bcond_with openh264 +%global __js_jquery_latest %{_datadir}/javascript/jquery/latest/ + +# These are necessary as the _with_foo is *not* defined if the +# --with flag isn't specifed, and we need to have the --without +# specified option in that case. +%if %{without enc_x264} +%global _with_enc_x264 --without-enc_x264 +%endif + +%if %{with enc_x265} +%global _with_enc_x265 --with-enc_x265 +%endif + +%if %{without dec_avcodec2} +%global _with_dec_avcodec2 --without-dec_avcodec2 +%endif + +%if %{without csc_swscale} +%global _with_csc_swscale --without-csc_swscale %endif # Remove private provides from .so files in the python3_sitearch directory @@ -19,25 +48,20 @@ %global cupslibdir %(cups-config --serverbin 2> /dev/null || echo "/usr/lib/cups") %endif -%global gnome_shell_extension input-source-manager@xpra_org - -%global build_opts -C--global-option=--without-nvidia -C--global-option=--without-pandoc_lua -C--global-option=--with-verbose -C--global-option=--with-Xdummy -C--global-option=--with-Xdummy_wrapper -C--global-option=--without-strict -C--global-option=--with-vpx %{?with_debug:-C--global-option=--with-debug} %{?with_openh264:-C--global-option=--with-openh264} -C--global-option=--without-cuda_rebuild -C--global-option=--with-client -C--global-option=--without-qt6_client -C--global-option=--without-pyglet_client -C--global-option=--without-enc_x264 - Name: xpra -Version: 6.5.3 -Release: %autorelease -Epoch: 1 +Version: 5.0.10 +Release: %autorelease -b 1 Summary: Remote display server for applications and desktops -License: GPL-2.0-or-later AND BSD-2-Clause AND LGPL-3.0-or-later AND BSD-3-Clause +# Automatically converted from old format: GPLv2+ and BSD and LGPLv3+ and MIT - review is highly recommended. +License: GPL-2.0-or-later AND LicenseRef-Callaway-BSD AND LGPL-3.0-or-later AND LicenseRef-Callaway-MIT URL: https://www.xpra.org/ Source0: https://github.com/Xpra-org/xpra/archive/refs/tags/v%{version}/%{name}-%{version}.tar.gz - # Appdata file for Fedora Source1: %{name}.appdata.xml - -# Suggested from update testing -# https://bodhi.fedoraproject.org/updates/FEDORA-2025-0882918c25#comment-4407961 -Patch0: %{name}-fix_audio.patch +Patch1: ignore_assert_pandoc.patch +# Add compatibility with FFMPEG 7.0 +# https://github.com/Xpra-org/xpra/pull/4216 +Patch2: 0001-Add-compatibility-with-FFMPEG-7.0.patch BuildRequires: python3-devel BuildRequires: gtk3-devel @@ -50,7 +74,6 @@ BuildRequires: desktop-file-utils BuildRequires: libvpx-devel BuildRequires: libXdamage-devel BuildRequires: libXres-devel -BuildRequires: lua-devel BuildRequires: cups-devel BuildRequires: python3-cups BuildRequires: redhat-rpm-config @@ -58,11 +81,8 @@ BuildRequires: python3-rpm-macros BuildRequires: gcc-c++ BuildRequires: pam-devel BuildRequires: pandoc - # needs by setup.py to detect systemd `sd_listen_ENABLED = POSIX and pkg_config_ok("--exists", "libsystemd")` BuildRequires: systemd-devel - -BuildRequires: systemd-rpm-macros %if 0%{?fedora} BuildRequires: procps-ng-devel %endif @@ -70,30 +90,49 @@ BuildRequires: pkgconfig(libavif) BuildRequires: pkgconfig(libqrencode) BuildRequires: libdrm-devel BuildRequires: pkgconfig(libwebp) +%if 0%{?el8} +#BuildRequires: xorg-x11-server-Xvfb +#BuildRequires: cairo-devel +BuildRequires: pygobject3-devel +%else BuildRequires: python3-gobject-devel +%endif BuildRequires: libappstream-glib -BuildRequires: libasan BuildRequires: python3-cairo-devel BuildRequires: xorg-x11-server-Xorg BuildRequires: xorg-x11-drv-dummy -BuildRequires: xorg-x11-server-Xvfb BuildRequires: xorg-x11-xauth -BuildRequires: xxhash-devel BuildRequires: xkbcomp BuildRequires: setxkbmap %if %{with debug} BuildRequires: libasan %endif + +%if %{with enc_x264} +BuildRequires: x264-devel +%endif +# While ffmpeg-devel should only be needed in theses conditions, setup.py requires it anyway +#if %%{with dec_avcodec2} || %%{with csc_swscale} BuildRequires: pkgconfig(libavcodec) BuildRequires: pkgconfig(libavformat) BuildRequires: pkgconfig(libavutil) BuildRequires: pkgconfig(libswscale) -%if %{with openh264} -BuildRequires: noopenh264-devel -%endif +#endif Requires: python3-pillow +Requires: python3-cups +Requires: python3-pyopengl +Requires: python3-gobject +Requires: python3-inotify Requires: python3-lz4 +Requires: python3-ldap3 +Requires: python3-rencode +Requires: python3-netifaces +Requires: python3-dbus +Requires: python3-numpy +%if 0%{?fedora} +Requires: python3-zeroconf +%endif Requires: dbus-x11 Requires: xmodmap Requires: xrandr @@ -113,7 +152,23 @@ Requires: pulseaudio-utils%{?_isa} %endif Requires: cups-filesystem Requires: shared-mime-info%{?_isa} +Requires: js-jquery + +# python3-opencv is required for webcam forwarding support, client-side only. +# Available on Fedora only. +# https://github.com/Xpra-org/xpra/issues/4035#issuecomment-2405430577 +#%%{?fedora:Requires: python3-opencv} + +# Needed to create the xpra group +Requires(pre): shadow-utils + +# xpra-html5 is now separately provided +Obsoletes: xpra-html5 < 0:4.1-1 + Requires: systemd-udev%{?_isa} +Obsoletes: xpra-udev < %{version}-%{release} +Provides: xpra-udev = %{version}-%{release} + %description Xpra is "screen for X": it allows you to run X programs, usually on a remote host, direct their display to your local machine, and then to disconnect from @@ -126,68 +181,40 @@ Sessions can be accessed over SSH, or password protected over plain TCP sockets. Xpra is usable over reasonably slow links and does its best to adapt to changing network bandwidth constraints. -%package -n %{name}-client-gnome -Summary: Gnome integration for the xpra client -Requires: %{name}-client-gtk3%{?_isa} = 1:%{version}-%{release} -Requires: gnome-shell-extension-appindicator -%description -n %{name}-client-gnome -This package installs the GNOME Shell extensions -that can help in restoring the system tray functionality. -It also includes the gnome_shell_extension extension which -is required for querying and activating keyboard input sources. - -%package -n %{name}-client-gtk3 -Summary: GTK3 xpra client -BuildRequires: xclip -Requires: %{name}%{?_isa} = 1:%{version}-%{release} -%description -n %{name}-client-gtk3 -This package contains the GTK3 xpra client. - -%package -n %{name}-plugin-lua -Summary: Wireshark/tshark Lua dissector for the Xpra remote display protocol -BuildRequires: wireshark-devel -%{?lua_version:Requires: lua(abi) = %{lua_version}} -Requires: %{name}%{?_isa} = 1:%{version}-%{release} -Requires: wireshark-cli%{?_isa} -%description -n %{name}-plugin-lua -The dissector registers on TCP port 14500 (xpra default) and also -installs a heuristic detector so it picks up traffic on any port. -Use Decode As → Xpra to force it on a different port. - %prep -%autosetup -n %{name}-%{version} -N +%setup -q -n %{name}-%{version} -%if 0%{?fedora} || 0%{?rhel} >= 9 -%patch -P 0 -p1 -b .backup -%endif - -rm -rf *.egg-info +%patch -P1 -p1 +%patch -P2 -p1 # cc1: error: unrecognized compiler option ‘-mfpmath=387’ %ifarch %{arm} sed -i 's|-mfpmath=387|-mfloat-abi=hard|' setup.py %endif -# Create a sysusers.d config file -cat >xpra.sysusers.conf </dev/null || groupadd -r xpra -%files -f %{pyproject_files} +%files %license COPYING %dir %{_sysconfdir}/xpra %dir %{_sysconfdir}/xpra/conf.d -%dir %{_sysconfdir}/xpra/content-type -%dir %{_sysconfdir}/xpra/pulse -%dir %{_rundir}/xpra -%config(noreplace) %{_sysconfdir}/xpra/pulse/xpra.pa %config(noreplace) %{_sysconfdir}/xpra/*.conf %config(noreplace) %{_sysconfdir}/xpra/nvenc.keys %config(noreplace) %{_sysconfdir}/xpra/conf.d/*.conf @@ -298,20 +294,19 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop %config(noreplace) %{_sysconfdir}/xpra/content-type/30_title.conf %config(noreplace) %{_sysconfdir}/xpra/content-type/50_class.conf %config(noreplace) %{_sysconfdir}/xpra/content-type/70_commands.conf -%config(noreplace) %{_sysconfdir}/xpra/content-type/90_fallback.conf %config(noreplace) %{_sysconfdir}/xpra/http-headers/00_nocache.txt %config(noreplace) %{_sysconfdir}/xpra/http-headers/10_content_security_policy.txt -%ghost %attr(1700,-,xpra) %{_rundir}/xpra/proxy %{_libexecdir}/xpra/ %{_bindir}/xpra %{_bindir}/xpra_launcher %{_bindir}/run_scaled -%{_bindir}/xpra_Xdummy +%{_sysusersdir}/*.conf +%{python3_sitearch}/xpra/ +%{python3_sitearch}/*.egg-info %{_datadir}/applications/xpra*.desktop %{_datadir}/icons/hicolor/48x48/apps/xpra-mdns.png %{_datadir}/icons/hicolor/48x48/apps/xpra-shadow.png %{_datadir}/icons/hicolor/64x64/apps/xpra.png -%{_datadir}/icons/xpra-large.png %{_mandir}/man1/xpra.1.* %{_mandir}/man1/xpra_*.1.* %{_mandir}/man1/run_scaled.1.* @@ -320,32 +315,11 @@ desktop-file-validate %{buildroot}%{_datadir}/applications/*.desktop %{_datadir}/xpra/ %{cupslibdir}/backend/xpraforwarder %{_tmpfilesdir}/xpra.conf +%dir %{_rundir}/xpra %{_docdir}/xpra %{_unitdir}/xpra.service -%{_unitdir}/xpra-encoder.service %{_unitdir}/xpra.socket -%{_unitdir}/xpra-encoder.socket %{_udevrulesdir}/71-xpra-virtual-pointer.rules -%{_sysusersdir}/xpra.conf - -%files -n %{name}-client-gtk3 -%{python3_sitearch}/xpra/client/gui/ -%{python3_sitearch}/xpra/client/gtk3/ -%{_libexecdir}/xpra/xpra_signal_listener -%{_datadir}/applications/xpra-launcher.desktop -%{_datadir}/applications/xpra-gui.desktop -%{_datadir}/applications/xpra.desktop -%{_datadir}/mime/packages/application-x-xpraconfig.xml -%{_datadir}/xpra/autostart.desktop - -%files -n %{name}-client-gnome -%{_datadir}/gnome-shell/extensions/%{gnome_shell_extension}/COPYING -%{_datadir}/gnome-shell/extensions/%{gnome_shell_extension}/README.md -%{_datadir}/gnome-shell/extensions/%{gnome_shell_extension}/extension.js -%{_datadir}/gnome-shell/extensions/%{gnome_shell_extension}/metadata.json - -%files -n %{name}-plugin-lua -%{wireshark_plugindir}/xpra_dissector.lua %changelog %autochangelog