Added new Wayland patches from Firefox 63, Added pipewire patch, Enabled Wayland by default for Fedora 30
This commit is contained in:
parent
ad2263b7a8
commit
d37312c85a
1943
firefox-pipewire.patch
Normal file
1943
firefox-pipewire.patch
Normal file
File diff suppressed because it is too large
Load Diff
231
firefox-x11.desktop
Normal file
231
firefox-x11.desktop
Normal file
@ -0,0 +1,231 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Version=1.0
|
||||||
|
Name=Firefox on X11
|
||||||
|
GenericName=Web Browser
|
||||||
|
Comment=Browse the Web
|
||||||
|
Exec=firefox-x11 --name firefox-x11 %u
|
||||||
|
Icon=firefox
|
||||||
|
Terminal=false
|
||||||
|
Type=Application
|
||||||
|
MimeType=text/html;text/xml;application/xhtml+xml;application/vnd.mozilla.xul+xml;text/mml;x-scheme-handler/http;x-scheme-handler/https;
|
||||||
|
StartupNotify=true
|
||||||
|
Categories=Network;WebBrowser;
|
||||||
|
Keywords=web;browser;internet;
|
||||||
|
Actions=new-window;new-private-window;
|
||||||
|
|
||||||
|
[Desktop Action new-window]
|
||||||
|
Name=Open a New Window
|
||||||
|
Name[ach]=Dirica manyen
|
||||||
|
Name[af]=Nuwe venster
|
||||||
|
Name[an]=Nueva finestra
|
||||||
|
Name[ar]=نافذة جديدة
|
||||||
|
Name[as]=নতুন উইন্ডো
|
||||||
|
Name[ast]=Ventana nueva
|
||||||
|
Name[az]=Yeni Pəncərə
|
||||||
|
Name[be]=Новае акно
|
||||||
|
Name[bg]=Нов прозорец
|
||||||
|
Name[bn-BD]=নতুন উইন্ডো (N)
|
||||||
|
Name[bn-IN]=নতুন উইন্ডো
|
||||||
|
Name[br]=Prenestr nevez
|
||||||
|
Name[brx]=गोदान उइन्ड'(N)
|
||||||
|
Name[bs]=Novi prozor
|
||||||
|
Name[ca]=Finestra nova
|
||||||
|
Name[cak]=K'ak'a' tzuwäch
|
||||||
|
Name[cs]=Nové okno
|
||||||
|
Name[cy]=Ffenestr Newydd
|
||||||
|
Name[da]=Nyt vindue
|
||||||
|
Name[de]=Neues Fenster
|
||||||
|
Name[dsb]=Nowe wokno
|
||||||
|
Name[el]=Νέο παράθυρο
|
||||||
|
Name[en-GB]=New Window
|
||||||
|
Name[en-US]=New Window
|
||||||
|
Name[en-ZA]=New Window
|
||||||
|
Name[eo]=Nova fenestro
|
||||||
|
Name[es-AR]=Nueva ventana
|
||||||
|
Name[es-CL]=Nueva ventana
|
||||||
|
Name[es-ES]=Nueva ventana
|
||||||
|
Name[es-MX]=Nueva ventana
|
||||||
|
Name[et]=Uus aken
|
||||||
|
Name[eu]=Leiho berria
|
||||||
|
Name[fa]=پنجره جدید
|
||||||
|
Name[ff]=Henorde Hesere
|
||||||
|
Name[fi]=Uusi ikkuna
|
||||||
|
Name[fr]=Nouvelle fenêtre
|
||||||
|
Name[fy-NL]=Nij finster
|
||||||
|
Name[ga-IE]=Fuinneog Nua
|
||||||
|
Name[gd]=Uinneag ùr
|
||||||
|
Name[gl]=Nova xanela
|
||||||
|
Name[gn]=Ovetã pyahu
|
||||||
|
Name[gu-IN]=નવી વિન્ડો
|
||||||
|
Name[he]=חלון חדש
|
||||||
|
Name[hi-IN]=नया विंडो
|
||||||
|
Name[hr]=Novi prozor
|
||||||
|
Name[hsb]=Nowe wokno
|
||||||
|
Name[hu]=Új ablak
|
||||||
|
Name[hy-AM]=Նոր Պատուհան
|
||||||
|
Name[id]=Jendela Baru
|
||||||
|
Name[is]=Nýr gluggi
|
||||||
|
Name[it]=Nuova finestra
|
||||||
|
Name[ja]=新しいウィンドウ
|
||||||
|
Name[ja-JP-mac]=新規ウインドウ
|
||||||
|
Name[ka]=ახალი ფანჯარა
|
||||||
|
Name[kk]=Жаңа терезе
|
||||||
|
Name[km]=បង្អួចថ្មី
|
||||||
|
Name[kn]=ಹೊಸ ಕಿಟಕಿ
|
||||||
|
Name[ko]=새 창
|
||||||
|
Name[kok]=नवें जनेल
|
||||||
|
Name[ks]=نئئ وِنڈو
|
||||||
|
Name[lij]=Neuvo barcon
|
||||||
|
Name[lo]=ຫນ້າຕ່າງໃຫມ່
|
||||||
|
Name[lt]=Naujas langas
|
||||||
|
Name[ltg]=Jauns lūgs
|
||||||
|
Name[lv]=Jauns logs
|
||||||
|
Name[mai]=नव विंडो
|
||||||
|
Name[mk]=Нов прозорец
|
||||||
|
Name[ml]=പുതിയ ജാലകം
|
||||||
|
Name[mr]=नवीन पटल
|
||||||
|
Name[ms]=Tetingkap Baru
|
||||||
|
Name[my]=ဝင်းဒိုးအသစ်
|
||||||
|
Name[nb-NO]=Nytt vindu
|
||||||
|
Name[ne-NP]=नयाँ सञ्झ्याल
|
||||||
|
Name[nl]=Nieuw venster
|
||||||
|
Name[nn-NO]=Nytt vindauge
|
||||||
|
Name[or]=ନୂତନ ୱିଣ୍ଡୋ
|
||||||
|
Name[pa-IN]=ਨਵੀਂ ਵਿੰਡੋ
|
||||||
|
Name[pl]=Nowe okno
|
||||||
|
Name[pt-BR]=Nova janela
|
||||||
|
Name[pt-PT]=Nova janela
|
||||||
|
Name[rm]=Nova fanestra
|
||||||
|
Name[ro]=Fereastră nouă
|
||||||
|
Name[ru]=Новое окно
|
||||||
|
Name[sat]=नावा विंडो (N)
|
||||||
|
Name[si]=නව කවුළුවක්
|
||||||
|
Name[sk]=Nové okno
|
||||||
|
Name[sl]=Novo okno
|
||||||
|
Name[son]=Zanfun taaga
|
||||||
|
Name[sq]=Dritare e Re
|
||||||
|
Name[sr]=Нови прозор
|
||||||
|
Name[sv-SE]=Nytt fönster
|
||||||
|
Name[ta]=புதிய சாளரம்
|
||||||
|
Name[te]=కొత్త విండో
|
||||||
|
Name[th]=หน้าต่างใหม่
|
||||||
|
Name[tr]=Yeni pencere
|
||||||
|
Name[tsz]=Eraatarakua jimpani
|
||||||
|
Name[uk]=Нове вікно
|
||||||
|
Name[ur]=نیا دریچہ
|
||||||
|
Name[uz]=Yangi oyna
|
||||||
|
Name[vi]=Cửa sổ mới
|
||||||
|
Name[wo]=Palanteer bu bees
|
||||||
|
Name[xh]=Ifestile entsha
|
||||||
|
Name[zh-CN]=新建窗口
|
||||||
|
Name[zh-TW]=開新視窗
|
||||||
|
Exec=firefox-x11 --name firefox-x11 --new-window %u
|
||||||
|
|
||||||
|
[Desktop Action new-private-window]
|
||||||
|
Name=Open a New Private Window
|
||||||
|
Name[ach]=Dirica manyen me mung
|
||||||
|
Name[af]=Nuwe privaatvenster
|
||||||
|
Name[an]=Nueva finestra privada
|
||||||
|
Name[ar]=نافذة خاصة جديدة
|
||||||
|
Name[as]=নতুন ব্যক্তিগত উইন্ডো
|
||||||
|
Name[ast]=Ventana privada nueva
|
||||||
|
Name[az]=Yeni Məxfi Pəncərə
|
||||||
|
Name[be]=Новае акно адасаблення
|
||||||
|
Name[bg]=Нов прозорец за поверително сърфиране
|
||||||
|
Name[bn-BD]=নতুন ব্যক্তিগত উইন্ডো
|
||||||
|
Name[bn-IN]=নতুন ব্যক্তিগত উইন্ডো
|
||||||
|
Name[br]=Prenestr merdeiñ prevez nevez
|
||||||
|
Name[brx]=गोदान प्राइभेट उइन्ड'
|
||||||
|
Name[bs]=Novi privatni prozor
|
||||||
|
Name[ca]=Finestra privada nova
|
||||||
|
Name[cak]=K'ak'a' ichinan tzuwäch
|
||||||
|
Name[cs]=Nové anonymní okno
|
||||||
|
Name[cy]=Ffenestr Breifat Newydd
|
||||||
|
Name[da]=Nyt privat vindue
|
||||||
|
Name[de]=Neues privates Fenster
|
||||||
|
Name[dsb]=Nowe priwatne wokno
|
||||||
|
Name[el]=Νέο παράθυρο ιδιωτικής περιήγησης
|
||||||
|
Name[en-GB]=New Private Window
|
||||||
|
Name[en-US]=New Private Window
|
||||||
|
Name[en-ZA]=New Private Window
|
||||||
|
Name[eo]=Nova privata fenestro
|
||||||
|
Name[es-AR]=Nueva ventana privada
|
||||||
|
Name[es-CL]=Nueva ventana privada
|
||||||
|
Name[es-ES]=Nueva ventana privada
|
||||||
|
Name[es-MX]=Nueva ventana privada
|
||||||
|
Name[et]=Uus privaatne aken
|
||||||
|
Name[eu]=Leiho pribatu berria
|
||||||
|
Name[fa]=پنجره ناشناس جدید
|
||||||
|
Name[ff]=Henorde Suturo Hesere
|
||||||
|
Name[fi]=Uusi yksityinen ikkuna
|
||||||
|
Name[fr]=Nouvelle fenêtre de navigation privée
|
||||||
|
Name[fy-NL]=Nij priveefinster
|
||||||
|
Name[ga-IE]=Fuinneog Nua Phríobháideach
|
||||||
|
Name[gd]=Uinneag phrìobhaideach ùr
|
||||||
|
Name[gl]=Nova xanela privada
|
||||||
|
Name[gn]=Ovetã ñemi pyahu
|
||||||
|
Name[gu-IN]=નવી ખાનગી વિન્ડો
|
||||||
|
Name[he]=חלון פרטי חדש
|
||||||
|
Name[hi-IN]=नयी निजी विंडो
|
||||||
|
Name[hr]=Novi privatni prozor
|
||||||
|
Name[hsb]=Nowe priwatne wokno
|
||||||
|
Name[hu]=Új privát ablak
|
||||||
|
Name[hy-AM]=Սկսել Գաղտնի դիտարկում
|
||||||
|
Name[id]=Jendela Mode Pribadi Baru
|
||||||
|
Name[is]=Nýr huliðsgluggi
|
||||||
|
Name[it]=Nuova finestra anonima
|
||||||
|
Name[ja]=新しいプライベートウィンドウ
|
||||||
|
Name[ja-JP-mac]=新規プライベートウインドウ
|
||||||
|
Name[ka]=ახალი პირადი ფანჯარა
|
||||||
|
Name[kk]=Жаңа жекелік терезе
|
||||||
|
Name[km]=បង្អួចឯកជនថ្មី
|
||||||
|
Name[kn]=ಹೊಸ ಖಾಸಗಿ ಕಿಟಕಿ
|
||||||
|
Name[ko]=새 사생활 보호 모드
|
||||||
|
Name[kok]=नवो खाजगी विंडो
|
||||||
|
Name[ks]=نْو پرایوٹ وینڈو&
|
||||||
|
Name[lij]=Neuvo barcon privou
|
||||||
|
Name[lo]=ເປີດຫນ້າຕ່າງສວນຕົວຂື້ນມາໃຫມ່
|
||||||
|
Name[lt]=Naujas privataus naršymo langas
|
||||||
|
Name[ltg]=Jauns privatais lūgs
|
||||||
|
Name[lv]=Jauns privātais logs
|
||||||
|
Name[mai]=नया निज विंडो (W)
|
||||||
|
Name[mk]=Нов приватен прозорец
|
||||||
|
Name[ml]=പുതിയ സ്വകാര്യ ജാലകം
|
||||||
|
Name[mr]=नवीन वैयक्तिक पटल
|
||||||
|
Name[ms]=Tetingkap Persendirian Baharu
|
||||||
|
Name[my]=New Private Window
|
||||||
|
Name[nb-NO]=Nytt privat vindu
|
||||||
|
Name[ne-NP]=नयाँ निजी सञ्झ्याल
|
||||||
|
Name[nl]=Nieuw privévenster
|
||||||
|
Name[nn-NO]=Nytt privat vindauge
|
||||||
|
Name[or]=ନୂତନ ବ୍ୟକ୍ତିଗତ ୱିଣ୍ଡୋ
|
||||||
|
Name[pa-IN]=ਨਵੀਂ ਪ੍ਰਾਈਵੇਟ ਵਿੰਡੋ
|
||||||
|
Name[pl]=Nowe okno prywatne
|
||||||
|
Name[pt-BR]=Nova janela privativa
|
||||||
|
Name[pt-PT]=Nova janela privada
|
||||||
|
Name[rm]=Nova fanestra privata
|
||||||
|
Name[ro]=Fereastră privată nouă
|
||||||
|
Name[ru]=Новое приватное окно
|
||||||
|
Name[sat]=नावा निजेराक् विंडो (W )
|
||||||
|
Name[si]=නව පුද්ගලික කවුළුව (W)
|
||||||
|
Name[sk]=Nové okno v režime Súkromné prehliadanie
|
||||||
|
Name[sl]=Novo zasebno okno
|
||||||
|
Name[son]=Sutura zanfun taaga
|
||||||
|
Name[sq]=Dritare e Re Private
|
||||||
|
Name[sr]=Нови приватан прозор
|
||||||
|
Name[sv-SE]=Nytt privat fönster
|
||||||
|
Name[ta]=புதிய தனிப்பட்ட சாளரம்
|
||||||
|
Name[te]=కొత్త ఆంతరంగిక విండో
|
||||||
|
Name[th]=หน้าต่างส่วนตัวใหม่
|
||||||
|
Name[tr]=Yeni gizli pencere
|
||||||
|
Name[tsz]=Juchiiti eraatarakua jimpani
|
||||||
|
Name[uk]=Приватне вікно
|
||||||
|
Name[ur]=نیا نجی دریچہ
|
||||||
|
Name[uz]=Yangi maxfiy oyna
|
||||||
|
Name[vi]=Cửa sổ riêng tư mới
|
||||||
|
Name[wo]=Panlanteeru biir bu bees
|
||||||
|
Name[xh]=Ifestile yangasese entsha
|
||||||
|
Name[zh-CN]=新建隐私浏览窗口
|
||||||
|
Name[zh-TW]=新增隱私視窗
|
||||||
|
Exec=firefox-x11 --private-window --name firefox-x11 %u
|
||||||
|
|
7
firefox-x11.sh.in
Normal file
7
firefox-x11.sh.in
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Run Firefox on X11 backend
|
||||||
|
#
|
||||||
|
|
||||||
|
export GDK_BACKEND=x11
|
||||||
|
exec /usr/bin/firefox "$@"
|
@ -66,6 +66,15 @@ MOZ_EXTENSIONS_PROFILE_DIR="$HOME/.mozilla/extensions/{ec8030f7-c20a-464f-9b0e-1
|
|||||||
MOZ_PROGRAM="$MOZ_DIST_BIN/$MOZ_FIREFOX_FILE"
|
MOZ_PROGRAM="$MOZ_DIST_BIN/$MOZ_FIREFOX_FILE"
|
||||||
MOZ_LAUNCHER="$MOZ_DIST_BIN/run-mozilla.sh"
|
MOZ_LAUNCHER="$MOZ_DIST_BIN/run-mozilla.sh"
|
||||||
|
|
||||||
|
##
|
||||||
|
## Enable X11 backend by default?
|
||||||
|
##
|
||||||
|
if __DEFAULT_X11__; then
|
||||||
|
if ! [ "$GDK_BACKEND" ]; then
|
||||||
|
export GDK_BACKEND=x11
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
##
|
##
|
||||||
## Set MOZ_GRE_CONF
|
## Set MOZ_GRE_CONF
|
||||||
##
|
##
|
||||||
@ -239,10 +248,6 @@ do
|
|||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
|
|
||||||
if ! [ "$GDK_BACKEND" ]; then
|
|
||||||
export GDK_BACKEND=x11
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Run the browser
|
# Run the browser
|
||||||
debugging=0
|
debugging=0
|
||||||
if [ $debugging = 1 ]
|
if [ $debugging = 1 ]
|
||||||
@ -250,5 +255,4 @@ then
|
|||||||
echo $MOZ_LAUNCHER $script_args $MOZ_PROGRAM "$@"
|
echo $MOZ_LAUNCHER $script_args $MOZ_PROGRAM "$@"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
exec $MOZ_LAUNCHER $script_args $MOZ_PROGRAM "$@"
|
exec $MOZ_LAUNCHER $script_args $MOZ_PROGRAM "$@"
|
||||||
|
74
firefox.spec
74
firefox.spec
@ -1,12 +1,10 @@
|
|||||||
# Use system nspr/nss?
|
# Use system nspr/nss?
|
||||||
%global system_nss 1
|
%global system_nss 1
|
||||||
|
|
||||||
# Wayland backend is not finished yet, see
|
# Make Wayland backend default?
|
||||||
# https://bugzilla.mozilla.org/show_bug.cgi?id=635134
|
%if 0%{?fedora} > 29
|
||||||
# for details.
|
%global wayland_backend_default 1
|
||||||
#
|
%endif
|
||||||
# Build with Wayland Gtk+ backend?
|
|
||||||
%global wayland_backend 1
|
|
||||||
|
|
||||||
# Use system sqlite?
|
# Use system sqlite?
|
||||||
%global system_sqlite 0
|
%global system_sqlite 0
|
||||||
@ -94,7 +92,7 @@
|
|||||||
Summary: Mozilla Firefox Web browser
|
Summary: Mozilla Firefox Web browser
|
||||||
Name: firefox
|
Name: firefox
|
||||||
Version: 62.0.3
|
Version: 62.0.3
|
||||||
Release: 1%{?pre_tag}%{?dist}
|
Release: 2%{?pre_tag}%{?dist}
|
||||||
URL: https://www.mozilla.org/firefox/
|
URL: https://www.mozilla.org/firefox/
|
||||||
License: MPLv1.1 or GPLv2+ or LGPLv2+
|
License: MPLv1.1 or GPLv2+ or LGPLv2+
|
||||||
Source0: https://hg.mozilla.org/releases/mozilla-release/archive/firefox-%{version}%{?pre_version}.source.tar.xz
|
Source0: https://hg.mozilla.org/releases/mozilla-release/archive/firefox-%{version}%{?pre_version}.source.tar.xz
|
||||||
@ -112,6 +110,8 @@ Source26: distribution.ini
|
|||||||
Source27: google-api-key
|
Source27: google-api-key
|
||||||
Source28: firefox-wayland.sh.in
|
Source28: firefox-wayland.sh.in
|
||||||
Source29: firefox-wayland.desktop
|
Source29: firefox-wayland.desktop
|
||||||
|
Source30: firefox-x11.sh.in
|
||||||
|
Source31: firefox-x11.desktop
|
||||||
|
|
||||||
# Build patches
|
# Build patches
|
||||||
Patch3: mozilla-build-arm.patch
|
Patch3: mozilla-build-arm.patch
|
||||||
@ -152,9 +152,11 @@ Patch419: rb244676.patch
|
|||||||
Patch420: rb246462.patch
|
Patch420: rb246462.patch
|
||||||
|
|
||||||
# Wayland specific upstream patches
|
# Wayland specific upstream patches
|
||||||
Patch570: mozilla-1467125.patch
|
|
||||||
Patch572: mozilla-1467128.patch
|
Patch572: mozilla-1467128.patch
|
||||||
Patch573: mozilla-1415078.patch
|
Patch573: mozilla-1415078.patch
|
||||||
|
Patch574: firefox-pipewire.patch
|
||||||
|
Patch577: mozilla-1444437.patch
|
||||||
|
Patch580: mozilla-wayland-trunk.patch
|
||||||
|
|
||||||
# Debian patches
|
# Debian patches
|
||||||
Patch500: mozilla-440908.patch
|
Patch500: mozilla-440908.patch
|
||||||
@ -199,6 +201,9 @@ BuildRequires: llvm
|
|||||||
BuildRequires: llvm-devel
|
BuildRequires: llvm-devel
|
||||||
BuildRequires: clang
|
BuildRequires: clang
|
||||||
BuildRequires: clang-libs
|
BuildRequires: clang-libs
|
||||||
|
%if 0%{?fedora} > 27
|
||||||
|
BuildRequires: pipewire-devel
|
||||||
|
%endif
|
||||||
|
|
||||||
Requires: mozilla-filesystem
|
Requires: mozilla-filesystem
|
||||||
Requires: p11-kit-trust
|
Requires: p11-kit-trust
|
||||||
@ -272,7 +277,17 @@ debug %{name}, you want to install %{name}-debuginfo instead.
|
|||||||
%files -n %{crashreporter_pkg_name} -f debugcrashreporter.list
|
%files -n %{crashreporter_pkg_name} -f debugcrashreporter.list
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
%if %{?wayland_backend}
|
%if %{?wayland_backend_default}
|
||||||
|
%package x11
|
||||||
|
Summary: Firefox X11 launcher.
|
||||||
|
Requires: %{name}
|
||||||
|
%description x11
|
||||||
|
The firefox-x11 package contains launcher and desktop file
|
||||||
|
to run Firefox natively on X11.
|
||||||
|
%files x11
|
||||||
|
%{_bindir}/firefox-x11
|
||||||
|
%{_datadir}/applications/firefox-x11.desktop
|
||||||
|
%else
|
||||||
%package wayland
|
%package wayland
|
||||||
Summary: Firefox Wayland launcher.
|
Summary: Firefox Wayland launcher.
|
||||||
Requires: %{name}
|
Requires: %{name}
|
||||||
@ -284,6 +299,7 @@ to run Firefox natively on Wayland.
|
|||||||
%{_datadir}/applications/firefox-wayland.desktop
|
%{_datadir}/applications/firefox-wayland.desktop
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
|
|
||||||
%if %{run_tests}
|
%if %{run_tests}
|
||||||
%global testsuite_pkg_name mozilla-%{name}-testresults
|
%global testsuite_pkg_name mozilla-%{name}-testresults
|
||||||
%package -n %{testsuite_pkg_name}
|
%package -n %{testsuite_pkg_name}
|
||||||
@ -328,10 +344,8 @@ This package contains results of tests executed during build.
|
|||||||
%patch406 -p1 -b .256180
|
%patch406 -p1 -b .256180
|
||||||
%patch413 -p1 -b .1353817
|
%patch413 -p1 -b .1353817
|
||||||
%ifarch %{arm}
|
%ifarch %{arm}
|
||||||
%patch415 -p1 -b .mozilla-1238661
|
%patch415 -p1 -b .1238661
|
||||||
%endif
|
%endif
|
||||||
#%patch416 -p1 -b .1424422
|
|
||||||
#%patch417 -p1 -b .bug1375074-save-restore-x28
|
|
||||||
%patch419 -p1 -b .rb244676
|
%patch419 -p1 -b .rb244676
|
||||||
%patch420 -p1 -b .rb246462
|
%patch420 -p1 -b .rb246462
|
||||||
|
|
||||||
@ -341,19 +355,17 @@ This package contains results of tests executed during build.
|
|||||||
%endif
|
%endif
|
||||||
|
|
||||||
# Wayland specific upstream patches
|
# Wayland specific upstream patches
|
||||||
%if %{?wayland_backend}
|
%patch572 -p1 -b .1467128
|
||||||
%patch570 -p1 -b .mozilla-1467125
|
%patch573 -p1 -b .1415078
|
||||||
%patch572 -p1 -b .mozilla-1467128
|
%if 0%{?fedora} > 27
|
||||||
%patch573 -p1 -b .mozilla-1415078
|
%patch574 -p1 -b .firefox-pipewire
|
||||||
%endif
|
%endif
|
||||||
|
%patch577 -p1 -b .1444437
|
||||||
|
%patch580 -p1 -b .mozilla-wayland-trunk
|
||||||
|
|
||||||
%{__rm} -f .mozconfig
|
%{__rm} -f .mozconfig
|
||||||
%{__cp} %{SOURCE10} .mozconfig
|
%{__cp} %{SOURCE10} .mozconfig
|
||||||
%if %{?wayland_backend}
|
|
||||||
echo "ac_add_options --enable-default-toolkit=cairo-gtk3-wayland" >> .mozconfig
|
echo "ac_add_options --enable-default-toolkit=cairo-gtk3-wayland" >> .mozconfig
|
||||||
%else
|
|
||||||
echo "ac_add_options --enable-default-toolkit=cairo-gtk3" >> .mozconfig
|
|
||||||
%endif
|
|
||||||
%if %{official_branding}
|
%if %{official_branding}
|
||||||
echo "ac_add_options --enable-official-branding" >> .mozconfig
|
echo "ac_add_options --enable-official-branding" >> .mozconfig
|
||||||
%endif
|
%endif
|
||||||
@ -588,15 +600,26 @@ DESTDIR=%{buildroot} make -C objdir install
|
|||||||
%{__mkdir_p} %{buildroot}{%{_libdir},%{_bindir},%{_datadir}/applications}
|
%{__mkdir_p} %{buildroot}{%{_libdir},%{_bindir},%{_datadir}/applications}
|
||||||
|
|
||||||
desktop-file-install --dir %{buildroot}%{_datadir}/applications %{SOURCE20}
|
desktop-file-install --dir %{buildroot}%{_datadir}/applications %{SOURCE20}
|
||||||
%if %{?wayland_backend}
|
%if %{?wayland_backend_default}
|
||||||
|
desktop-file-install --dir %{buildroot}%{_datadir}/applications %{SOURCE31}
|
||||||
|
%else
|
||||||
desktop-file-install --dir %{buildroot}%{_datadir}/applications %{SOURCE29}
|
desktop-file-install --dir %{buildroot}%{_datadir}/applications %{SOURCE29}
|
||||||
%endif
|
%endif
|
||||||
|
|
||||||
# set up the firefox start script
|
# set up the firefox start script
|
||||||
|
%if %{?wayland_backend_default}
|
||||||
|
%global x11_state false
|
||||||
|
%else
|
||||||
|
%global x11_state true
|
||||||
|
%endif
|
||||||
%{__rm} -rf %{buildroot}%{_bindir}/firefox
|
%{__rm} -rf %{buildroot}%{_bindir}/firefox
|
||||||
%{__cat} %{SOURCE21} > %{buildroot}%{_bindir}/firefox
|
%{__sed} -e 's/__DEFAULT_X11__/%{x11_state}/' %{SOURCE21} > %{buildroot}%{_bindir}/firefox
|
||||||
|
|
||||||
%{__chmod} 755 %{buildroot}%{_bindir}/firefox
|
%{__chmod} 755 %{buildroot}%{_bindir}/firefox
|
||||||
%if %{?wayland_backend}
|
%if %{?wayland_backend_default}
|
||||||
|
%{__cat} %{SOURCE30} > %{buildroot}%{_bindir}/firefox-x11
|
||||||
|
%{__chmod} 755 %{buildroot}%{_bindir}/firefox-x11
|
||||||
|
%else
|
||||||
%{__cat} %{SOURCE28} > %{buildroot}%{_bindir}/firefox-wayland
|
%{__cat} %{SOURCE28} > %{buildroot}%{_bindir}/firefox-wayland
|
||||||
%{__chmod} 755 %{buildroot}%{_bindir}/firefox-wayland
|
%{__chmod} 755 %{buildroot}%{_bindir}/firefox-wayland
|
||||||
%endif
|
%endif
|
||||||
@ -862,6 +885,11 @@ gtk-update-icon-cache %{_datadir}/icons/hicolor &>/dev/null || :
|
|||||||
#---------------------------------------------------------------------
|
#---------------------------------------------------------------------
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Mon Oct 8 2018 Martin Stransky <stransky@redhat.com> - 62.0.3-2
|
||||||
|
- Added pipewire patch (mozbz#1496359)
|
||||||
|
- Added Wayland patches from Firefox 63
|
||||||
|
- Enable Wayland backed by default on Fedora 30
|
||||||
|
|
||||||
* Tue Oct 2 2018 Martin Stransky <stransky@redhat.com> - 62.0.3-1
|
* Tue Oct 2 2018 Martin Stransky <stransky@redhat.com> - 62.0.3-1
|
||||||
- Updated to latest upstream (62.0.3)
|
- Updated to latest upstream (62.0.3)
|
||||||
|
|
||||||
|
183
mozilla-1444437.patch
Normal file
183
mozilla-1444437.patch
Normal file
@ -0,0 +1,183 @@
|
|||||||
|
|
||||||
|
# HG changeset patch
|
||||||
|
# User Martin Stransky <stransky@redhat.com>
|
||||||
|
# Date 1530185851 -7200
|
||||||
|
# Node ID 7dc09bb0f57c3397f68c424b2a4e781e89069517
|
||||||
|
# Parent 15c95df467be553beb39f2e8102c206639e05fde
|
||||||
|
Bug 1444437 - [Wayland] Don't map mozcontainer subsurface until parent surface is commited, r?ashie
|
||||||
|
|
||||||
|
MozReview-Commit-ID: 4qoyGH8VCAU
|
||||||
|
|
||||||
|
diff --git a/widget/gtk/mozcontainer.cpp b/widget/gtk/mozcontainer.cpp
|
||||||
|
--- a/widget/gtk/mozcontainer.cpp
|
||||||
|
+++ b/widget/gtk/mozcontainer.cpp
|
||||||
|
@@ -207,17 +207,17 @@ moz_container_init (MozContainer *contai
|
||||||
|
gtk_widget_set_redraw_on_allocate(GTK_WIDGET(container), FALSE);
|
||||||
|
|
||||||
|
#if defined(MOZ_WAYLAND)
|
||||||
|
{
|
||||||
|
container->subcompositor = nullptr;
|
||||||
|
container->surface = nullptr;
|
||||||
|
container->subsurface = nullptr;
|
||||||
|
container->eglwindow = nullptr;
|
||||||
|
- container->committed = false;
|
||||||
|
+ container->parent_surface_committed = false;
|
||||||
|
|
||||||
|
GdkDisplay *gdk_display = gtk_widget_get_display(GTK_WIDGET(container));
|
||||||
|
if (GDK_IS_WAYLAND_DISPLAY (gdk_display)) {
|
||||||
|
// Available as of GTK 3.8+
|
||||||
|
static auto sGdkWaylandDisplayGetWlDisplay =
|
||||||
|
(wl_display *(*)(GdkDisplay *))
|
||||||
|
dlsym(RTLD_DEFAULT, "gdk_wayland_display_get_wl_display");
|
||||||
|
|
||||||
|
@@ -228,21 +228,22 @@ moz_container_init (MozContainer *contai
|
||||||
|
wl_display_roundtrip(display);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if defined(MOZ_WAYLAND)
|
||||||
|
static void
|
||||||
|
-moz_container_after_paint(GdkFrameClock *clock, MozContainer *container)
|
||||||
|
+moz_container_commited_handler(GdkFrameClock *clock, MozContainer *container)
|
||||||
|
{
|
||||||
|
- container->committed = true;
|
||||||
|
- g_signal_handlers_disconnect_by_func(clock,
|
||||||
|
- reinterpret_cast<gpointer>(moz_container_after_paint), container);
|
||||||
|
+ container->parent_surface_committed = true;
|
||||||
|
+ g_signal_handler_disconnect(clock,
|
||||||
|
+ container->parent_surface_committed_handler);
|
||||||
|
+ container->parent_surface_committed_handler = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We want to draw to GdkWindow owned by mContainer from Compositor thread but
|
||||||
|
* Gtk+ can be used in main thread only. So we create wayland wl_surface
|
||||||
|
* and attach it as an overlay to GdkWindow.
|
||||||
|
*
|
||||||
|
* see gtk_clutter_embed_ensure_subsurface() at gtk-clutter-embed.c
|
||||||
|
* for reference.
|
||||||
|
@@ -263,37 +264,44 @@ moz_container_map_surface(MozContainer *
|
||||||
|
|
||||||
|
GdkDisplay *display = gtk_widget_get_display(GTK_WIDGET(container));
|
||||||
|
if (GDK_IS_X11_DISPLAY(display))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (container->subsurface && container->surface)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
+ if (!container->parent_surface_committed) {
|
||||||
|
+ if (!container->parent_surface_committed_handler) {
|
||||||
|
+ GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(container));
|
||||||
|
+ GdkFrameClock *clock = sGdkWindowGetFrameClock(window);
|
||||||
|
+ container->parent_surface_committed_handler =
|
||||||
|
+ g_signal_connect_after(clock, "after-paint",
|
||||||
|
+ G_CALLBACK(moz_container_commited_handler),
|
||||||
|
+ container);
|
||||||
|
+ }
|
||||||
|
+ return false;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
if (!container->surface) {
|
||||||
|
struct wl_compositor *compositor;
|
||||||
|
compositor = sGdkWaylandDisplayGetWlCompositor(display);
|
||||||
|
container->surface = wl_compositor_create_surface(compositor);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!container->subsurface) {
|
||||||
|
GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(container));
|
||||||
|
wl_surface* gtk_surface = sGdkWaylandWindowGetWlSurface(window);
|
||||||
|
if (!gtk_surface) {
|
||||||
|
// We requested the underlying wl_surface too early when container
|
||||||
|
// is not realized yet. We'll try again before first rendering
|
||||||
|
// to mContainer.
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
- GdkFrameClock *clock = sGdkWindowGetFrameClock(window);
|
||||||
|
- g_signal_connect_after(clock, "after-paint",
|
||||||
|
- G_CALLBACK(moz_container_after_paint),
|
||||||
|
- container);
|
||||||
|
-
|
||||||
|
container->subsurface =
|
||||||
|
wl_subcompositor_get_subsurface (container->subcompositor,
|
||||||
|
container->surface,
|
||||||
|
gtk_surface);
|
||||||
|
gint x, y;
|
||||||
|
gdk_window_get_position(window, &x, &y);
|
||||||
|
wl_subsurface_set_position(container->subsurface, x, y);
|
||||||
|
wl_subsurface_set_desync(container->subsurface);
|
||||||
|
@@ -310,17 +318,29 @@ moz_container_map_surface(MozContainer *
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
moz_container_unmap_surface(MozContainer *container)
|
||||||
|
{
|
||||||
|
g_clear_pointer(&container->eglwindow, wl_egl_window_destroy);
|
||||||
|
g_clear_pointer(&container->subsurface, wl_subsurface_destroy);
|
||||||
|
g_clear_pointer(&container->surface, wl_surface_destroy);
|
||||||
|
- container->committed = false;
|
||||||
|
+
|
||||||
|
+ if (container->parent_surface_committed_handler) {
|
||||||
|
+ static auto sGdkWindowGetFrameClock =
|
||||||
|
+ (GdkFrameClock *(*)(GdkWindow *))
|
||||||
|
+ dlsym(RTLD_DEFAULT, "gdk_window_get_frame_clock");
|
||||||
|
+ GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(container));
|
||||||
|
+ GdkFrameClock *clock = sGdkWindowGetFrameClock(window);
|
||||||
|
+
|
||||||
|
+ g_signal_handler_disconnect(clock,
|
||||||
|
+ container->parent_surface_committed_handler);
|
||||||
|
+ container->parent_surface_committed_handler = 0;
|
||||||
|
+ }
|
||||||
|
+ container->parent_surface_committed = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void
|
||||||
|
moz_container_map (GtkWidget *widget)
|
||||||
|
{
|
||||||
|
MozContainer *container;
|
||||||
|
@@ -582,17 +602,17 @@ moz_container_get_wl_surface(MozContaine
|
||||||
|
if (!container->subsurface || !container->surface) {
|
||||||
|
GdkWindow* window = gtk_widget_get_window(GTK_WIDGET(container));
|
||||||
|
if (!gdk_window_is_visible(window))
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
moz_container_map_surface(container);
|
||||||
|
}
|
||||||
|
|
||||||
|
- return container->committed ? container->surface : nullptr;
|
||||||
|
+ return container->surface;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct wl_egl_window *
|
||||||
|
moz_container_get_wl_egl_window(MozContainer *container)
|
||||||
|
{
|
||||||
|
if (!container->eglwindow) {
|
||||||
|
struct wl_surface *wlsurf = moz_container_get_wl_surface(container);
|
||||||
|
if (!wlsurf)
|
||||||
|
diff --git a/widget/gtk/mozcontainer.h b/widget/gtk/mozcontainer.h
|
||||||
|
--- a/widget/gtk/mozcontainer.h
|
||||||
|
+++ b/widget/gtk/mozcontainer.h
|
||||||
|
@@ -68,17 +68,18 @@ struct _MozContainer
|
||||||
|
GtkContainer container;
|
||||||
|
GList *children;
|
||||||
|
|
||||||
|
#ifdef MOZ_WAYLAND
|
||||||
|
struct wl_subcompositor *subcompositor;
|
||||||
|
struct wl_surface *surface;
|
||||||
|
struct wl_subsurface *subsurface;
|
||||||
|
struct wl_egl_window *eglwindow;
|
||||||
|
- gboolean committed;
|
||||||
|
+ gboolean parent_surface_committed;
|
||||||
|
+ gulong parent_surface_committed_handler;
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
struct _MozContainerClass
|
||||||
|
{
|
||||||
|
GtkContainerClass parent_class;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
@ -1,26 +0,0 @@
|
|||||||
diff --git a/widget/gtk/WindowSurfaceWayland.cpp b/widget/gtk/WindowSurfaceWayland.cpp
|
|
||||||
--- a/widget/gtk/WindowSurfaceWayland.cpp
|
|
||||||
+++ b/widget/gtk/WindowSurfaceWayland.cpp
|
|
||||||
@@ -146,18 +146,19 @@ static StaticMutex gWaylandDisplaysMutex
|
|
||||||
//
|
|
||||||
// nsWaylandDisplay is our interface to wayland compositor. It provides wayland
|
|
||||||
// global objects as we need (wl_display, wl_shm) and operates wl_event_queue on
|
|
||||||
// compositor (not the main) thread.
|
|
||||||
static nsWaylandDisplay* WaylandDisplayGet(wl_display *aDisplay);
|
|
||||||
static void WaylandDisplayRelease(wl_display *aDisplay);
|
|
||||||
static void WaylandDisplayLoop(wl_display *aDisplay);
|
|
||||||
|
|
||||||
-// TODO: is the 60pfs loop correct?
|
|
||||||
-#define EVENT_LOOP_DELAY (1000/60)
|
|
||||||
+// TODO: Bug 1467125 - We need to integrate wl_display_dispatch_queue_pending() with
|
|
||||||
+// compositor event loop.
|
|
||||||
+#define EVENT_LOOP_DELAY (1000/240)
|
|
||||||
|
|
||||||
// Get WaylandDisplay for given wl_display and actual calling thread.
|
|
||||||
static nsWaylandDisplay*
|
|
||||||
WaylandDisplayGetLocked(wl_display *aDisplay, const StaticMutexAutoLock&)
|
|
||||||
{
|
|
||||||
nsWaylandDisplay* waylandDisplay = nullptr;
|
|
||||||
|
|
||||||
int len = gWaylandDisplays.Count();
|
|
||||||
|
|
@ -1,49 +1,19 @@
|
|||||||
diff --git a/gfx/thebes/gfxPlatformGtk.h b/gfx/thebes/gfxPlatformGtk.h
|
|
||||||
--- a/gfx/thebes/gfxPlatformGtk.h
|
|
||||||
+++ b/gfx/thebes/gfxPlatformGtk.h
|
|
||||||
@@ -102,23 +102,42 @@ public:
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef MOZ_X11
|
# HG changeset patch
|
||||||
Display* GetCompositorDisplay() {
|
# User Martin Stransky <stransky@redhat.com>
|
||||||
return mCompositorDisplay;
|
# Date 1530270941 -7200
|
||||||
}
|
# Node ID 338c0093263be6440a33b79a92801bd2b4658f79
|
||||||
#endif // MOZ_X11
|
# Parent 84a6d5a0b551f5da116aab702dd38bb725bc8a08
|
||||||
|
Bug 1467128 - [Wayland] Get VSync from Gtk/Wayland, r?lsalzman
|
||||||
|
|
||||||
+#ifdef MOZ_WAYLAND
|
VSync on Wayland is a bit tricky as we can get only "last VSync" event signal with
|
||||||
+ void SetWaylandLastVsync(uint32_t aVsyncTimestamp) {
|
CLOCK_MONOTONIC timestamp or none (if application is hidden/minimized).
|
||||||
+ mWaylandLastVsyncTimestamp = aVsyncTimestamp;
|
|
||||||
+ }
|
|
||||||
+ int64_t GetWaylandLastVsync() {
|
|
||||||
+ return mWaylandLastVsyncTimestamp;
|
|
||||||
+ }
|
|
||||||
+ void SetWaylandFrameDelay(int64_t aFrameDelay) {
|
|
||||||
+ mWaylandFrameDelay = aFrameDelay;
|
|
||||||
+ }
|
|
||||||
+ int64_t GetWaylandFrameDelay() {
|
|
||||||
+ return mWaylandFrameDelay;
|
|
||||||
+ }
|
|
||||||
+#endif
|
|
||||||
+
|
|
||||||
protected:
|
|
||||||
bool CheckVariationFontSupport() override;
|
|
||||||
|
|
||||||
int8_t mMaxGenericSubstitutions;
|
That means we should draw a next frame at "last Vsync + frame delay" time and also
|
||||||
|
approximate next VSync event when we don't get any.
|
||||||
|
|
||||||
private:
|
MozReview-Commit-ID: FI3Z4nkmDNK
|
||||||
virtual void GetPlatformCMSOutputProfile(void *&mem,
|
|
||||||
size_t &size) override;
|
|
||||||
|
|
||||||
#ifdef MOZ_X11
|
|
||||||
Display* mCompositorDisplay;
|
|
||||||
#endif
|
|
||||||
+#ifdef MOZ_WAYLAND
|
|
||||||
+ int64_t mWaylandLastVsyncTimestamp;
|
|
||||||
+ int64_t mWaylandFrameDelay;
|
|
||||||
+#endif
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif /* GFX_PLATFORM_GTK_H */
|
|
||||||
diff --git a/gfx/thebes/gfxPlatformGtk.cpp b/gfx/thebes/gfxPlatformGtk.cpp
|
diff --git a/gfx/thebes/gfxPlatformGtk.cpp b/gfx/thebes/gfxPlatformGtk.cpp
|
||||||
--- a/gfx/thebes/gfxPlatformGtk.cpp
|
--- a/gfx/thebes/gfxPlatformGtk.cpp
|
||||||
+++ b/gfx/thebes/gfxPlatformGtk.cpp
|
+++ b/gfx/thebes/gfxPlatformGtk.cpp
|
||||||
@ -334,26 +304,49 @@ diff --git a/gfx/thebes/gfxPlatformGtk.cpp b/gfx/thebes/gfxPlatformGtk.cpp
|
|||||||
NS_WARNING("SGI_video_sync unsupported. Falling back to software vsync.");
|
NS_WARNING("SGI_video_sync unsupported. Falling back to software vsync.");
|
||||||
}
|
}
|
||||||
return gfxPlatform::CreateHardwareVsyncSource();
|
return gfxPlatform::CreateHardwareVsyncSource();
|
||||||
diff --git a/widget/gtk/WindowSurfaceWayland.cpp b/widget/gtk/WindowSurfaceWayland.cpp
|
diff --git a/gfx/thebes/gfxPlatformGtk.h b/gfx/thebes/gfxPlatformGtk.h
|
||||||
--- a/widget/gtk/WindowSurfaceWayland.cpp
|
--- a/gfx/thebes/gfxPlatformGtk.h
|
||||||
+++ b/widget/gtk/WindowSurfaceWayland.cpp
|
+++ b/gfx/thebes/gfxPlatformGtk.h
|
||||||
@@ -546,16 +546,18 @@ WindowBackBuffer::Lock()
|
@@ -102,23 +102,42 @@ public:
|
||||||
mWaylandDisplay->GetSurfaceFormat());
|
#endif
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
#ifdef MOZ_X11
|
||||||
frame_callback_handler(void *data, struct wl_callback *callback, uint32_t time)
|
Display* GetCompositorDisplay() {
|
||||||
{
|
return mCompositorDisplay;
|
||||||
auto surface = reinterpret_cast<WindowSurfaceWayland*>(data);
|
}
|
||||||
surface->FrameCallbackHandler();
|
#endif // MOZ_X11
|
||||||
|
|
||||||
|
+#ifdef MOZ_WAYLAND
|
||||||
|
+ void SetWaylandLastVsync(uint32_t aVsyncTimestamp) {
|
||||||
|
+ mWaylandLastVsyncTimestamp = aVsyncTimestamp;
|
||||||
|
+ }
|
||||||
|
+ int64_t GetWaylandLastVsync() {
|
||||||
|
+ return mWaylandLastVsyncTimestamp;
|
||||||
|
+ }
|
||||||
|
+ void SetWaylandFrameDelay(int64_t aFrameDelay) {
|
||||||
|
+ mWaylandFrameDelay = aFrameDelay;
|
||||||
|
+ }
|
||||||
|
+ int64_t GetWaylandFrameDelay() {
|
||||||
|
+ return mWaylandFrameDelay;
|
||||||
|
+ }
|
||||||
|
+#endif
|
||||||
+
|
+
|
||||||
+ gfxPlatformGtk::GetPlatform()->SetWaylandLastVsync(time);
|
protected:
|
||||||
}
|
bool CheckVariationFontSupport() override;
|
||||||
|
|
||||||
static const struct wl_callback_listener frame_listener = {
|
int8_t mMaxGenericSubstitutions;
|
||||||
frame_callback_handler
|
|
||||||
|
private:
|
||||||
|
virtual void GetPlatformCMSOutputProfile(void *&mem,
|
||||||
|
size_t &size) override;
|
||||||
|
|
||||||
|
#ifdef MOZ_X11
|
||||||
|
Display* mCompositorDisplay;
|
||||||
|
#endif
|
||||||
|
+#ifdef MOZ_WAYLAND
|
||||||
|
+ int64_t mWaylandLastVsyncTimestamp;
|
||||||
|
+ int64_t mWaylandFrameDelay;
|
||||||
|
+#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
WindowSurfaceWayland::WindowSurfaceWayland(nsWindow *aWindow)
|
#endif /* GFX_PLATFORM_GTK_H */
|
||||||
: mWindow(aWindow)
|
|
||||||
|
|
||||||
|
40
mozilla-1491824.patch
Normal file
40
mozilla-1491824.patch
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
diff -up firefox-62.0.3/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium.old firefox-62.0.3/media/libyuv/libyuv/tools_libyuv/autoroller/unittests/testdata/DEPS.chromium
|
||||||
|
diff -up firefox-62.0.3/media/webrtc/trunk/Makefile.old firefox-62.0.3/media/webrtc/trunk/Makefile
|
||||||
|
diff -up firefox-62.0.3/widget/gtk/nsClipboardWayland.cpp.old firefox-62.0.3/widget/gtk/nsClipboardWayland.cpp
|
||||||
|
--- firefox-62.0.3/widget/gtk/nsClipboardWayland.cpp.old 2018-10-05 12:52:40.067567770 +0200
|
||||||
|
+++ firefox-62.0.3/widget/gtk/nsClipboardWayland.cpp 2018-09-21 12:39:40.477095989 +0200
|
||||||
|
@@ -153,7 +153,7 @@ DataOffer::GetData(wl_display* aDisplay,
|
||||||
|
|
||||||
|
GIOChannel *channel = g_io_channel_unix_new(pipe_fd[0]);
|
||||||
|
GError* error = nullptr;
|
||||||
|
- char* clipboardData;
|
||||||
|
+ char* clipboardData = nullptr;
|
||||||
|
|
||||||
|
g_io_channel_set_encoding(channel, nullptr, &error);
|
||||||
|
if (!error) {
|
||||||
|
@@ -470,13 +470,17 @@ nsRetrievalContextWayland::SetClipboardD
|
||||||
|
// Delete existing clipboard data offer
|
||||||
|
mClipboardOffer = nullptr;
|
||||||
|
|
||||||
|
- DataOffer* dataOffer =
|
||||||
|
- static_cast<DataOffer*>(g_hash_table_lookup(mActiveOffers,
|
||||||
|
- aWaylandDataOffer));
|
||||||
|
- NS_ASSERTION(dataOffer, "We're missing clipboard data offer!");
|
||||||
|
- if (dataOffer) {
|
||||||
|
- g_hash_table_remove(mActiveOffers, aWaylandDataOffer);
|
||||||
|
- mClipboardOffer = dataOffer;
|
||||||
|
+ // null aWaylandDataOffer indicates that our clipboard content
|
||||||
|
+ // is no longer valid and should be release.
|
||||||
|
+ if (aWaylandDataOffer != nullptr) {
|
||||||
|
+ DataOffer* dataOffer =
|
||||||
|
+ static_cast<DataOffer*>(g_hash_table_lookup(mActiveOffers,
|
||||||
|
+ aWaylandDataOffer));
|
||||||
|
+ NS_ASSERTION(dataOffer, "We're missing stored clipboard data offer!");
|
||||||
|
+ if (dataOffer) {
|
||||||
|
+ g_hash_table_remove(mActiveOffers, aWaylandDataOffer);
|
||||||
|
+ mClipboardOffer = dataOffer;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff -up firefox-62.0.3/widget/gtk/nsClipboardWayland.h.old firefox-62.0.3/widget/gtk/nsClipboardWayland.h
|
519
mozilla-wayland-trunk.patch
Normal file
519
mozilla-wayland-trunk.patch
Normal file
@ -0,0 +1,519 @@
|
|||||||
|
Wayland patches from Firefox 63.
|
||||||
|
|
||||||
|
diff -up firefox-62.0.3/widget/gtk/mozcontainer.cpp.old firefox-62.0.3/widget/gtk/mozcontainer.cpp
|
||||||
|
--- firefox-62.0.3/widget/gtk/mozcontainer.cpp.old 2018-10-08 11:52:33.442449788 +0200
|
||||||
|
+++ firefox-62.0.3/widget/gtk/mozcontainer.cpp 2018-08-21 14:22:12.668885853 +0200
|
||||||
|
@@ -605,6 +605,15 @@ moz_container_get_wl_surface(MozContaine
|
||||||
|
return nullptr;
|
||||||
|
|
||||||
|
moz_container_map_surface(container);
|
||||||
|
+ // Set the scale factor for the buffer right after we create it.
|
||||||
|
+ if (container->surface) {
|
||||||
|
+ static auto sGdkWindowGetScaleFactorPtr = (gint (*)(GdkWindow*))
|
||||||
|
+ dlsym(RTLD_DEFAULT, "gdk_window_get_scale_factor");
|
||||||
|
+ if (sGdkWindowGetScaleFactorPtr && window) {
|
||||||
|
+ gint scaleFactor = (*sGdkWindowGetScaleFactorPtr)(window);
|
||||||
|
+ wl_surface_set_buffer_scale(container->surface, scaleFactor);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
|
||||||
|
return container->surface;
|
||||||
|
diff -up firefox-62.0.3/widget/gtk/WindowSurfaceWayland.cpp.old firefox-62.0.3/widget/gtk/WindowSurfaceWayland.cpp
|
||||||
|
--- firefox-62.0.3/widget/gtk/WindowSurfaceWayland.cpp.old 2018-10-08 11:52:47.907392869 +0200
|
||||||
|
+++ firefox-62.0.3/widget/gtk/WindowSurfaceWayland.cpp 2018-09-06 11:01:18.801964790 +0200
|
||||||
|
@@ -151,8 +151,9 @@ static nsWaylandDisplay* WaylandDisplayG
|
||||||
|
static void WaylandDisplayRelease(wl_display *aDisplay);
|
||||||
|
static void WaylandDisplayLoop(wl_display *aDisplay);
|
||||||
|
|
||||||
|
-// TODO: is the 60pfs loop correct?
|
||||||
|
-#define EVENT_LOOP_DELAY (1000/60)
|
||||||
|
+// TODO: Bug 1467125 - We need to integrate wl_display_dispatch_queue_pending() with
|
||||||
|
+// compositor event loop.
|
||||||
|
+#define EVENT_LOOP_DELAY (1000/240)
|
||||||
|
|
||||||
|
// Get WaylandDisplay for given wl_display and actual calling thread.
|
||||||
|
static nsWaylandDisplay*
|
||||||
|
@@ -523,7 +524,7 @@ WindowBackBuffer::Detach()
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
-WindowBackBuffer::SetImageDataFromBackBuffer(
|
||||||
|
+WindowBackBuffer::SetImageDataFromBuffer(
|
||||||
|
class WindowBackBuffer* aSourceBuffer)
|
||||||
|
{
|
||||||
|
if (!IsMatchingSize(aSourceBuffer)) {
|
||||||
|
@@ -550,6 +551,8 @@ frame_callback_handler(void *data, struc
|
||||||
|
{
|
||||||
|
auto surface = reinterpret_cast<WindowSurfaceWayland*>(data);
|
||||||
|
surface->FrameCallbackHandler();
|
||||||
|
+
|
||||||
|
+ gfxPlatformGtk::GetPlatform()->SetWaylandLastVsync(time);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const struct wl_callback_listener frame_listener = {
|
||||||
|
@@ -559,27 +562,40 @@ static const struct wl_callback_listener
|
||||||
|
WindowSurfaceWayland::WindowSurfaceWayland(nsWindow *aWindow)
|
||||||
|
: mWindow(aWindow)
|
||||||
|
, mWaylandDisplay(WaylandDisplayGet(aWindow->GetWaylandDisplay()))
|
||||||
|
- , mFrontBuffer(nullptr)
|
||||||
|
- , mBackBuffer(nullptr)
|
||||||
|
+ , mWaylandBuffer(nullptr)
|
||||||
|
+ , mBackupBuffer(nullptr)
|
||||||
|
, mFrameCallback(nullptr)
|
||||||
|
- , mFrameCallbackSurface(nullptr)
|
||||||
|
+ , mLastCommittedSurface(nullptr)
|
||||||
|
, mDisplayThreadMessageLoop(MessageLoop::current())
|
||||||
|
- , mDirectWlBufferDraw(true)
|
||||||
|
- , mDelayedCommit(false)
|
||||||
|
- , mFullScreenDamage(false)
|
||||||
|
+ , mDelayedCommitHandle(nullptr)
|
||||||
|
+ , mDrawToWaylandBufferDirectly(true)
|
||||||
|
+ , mPendingCommit(false)
|
||||||
|
+ , mWaylandBufferFullScreenDamage(false)
|
||||||
|
, mIsMainThread(NS_IsMainThread())
|
||||||
|
+ , mNeedScaleFactorUpdate(true)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
WindowSurfaceWayland::~WindowSurfaceWayland()
|
||||||
|
{
|
||||||
|
- delete mFrontBuffer;
|
||||||
|
- delete mBackBuffer;
|
||||||
|
+ if (mPendingCommit) {
|
||||||
|
+ NS_WARNING("Deleted WindowSurfaceWayland with a pending commit!");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (mDelayedCommitHandle) {
|
||||||
|
+ // Delete reference to this to prevent WaylandBufferDelayCommitHandler()
|
||||||
|
+ // operate on released this. mDelayedCommitHandle itself will
|
||||||
|
+ // be released at WaylandBufferDelayCommitHandler().
|
||||||
|
+ *mDelayedCommitHandle = nullptr;
|
||||||
|
+ }
|
||||||
|
|
||||||
|
if (mFrameCallback) {
|
||||||
|
wl_callback_destroy(mFrameCallback);
|
||||||
|
}
|
||||||
|
|
||||||
|
+ delete mWaylandBuffer;
|
||||||
|
+ delete mBackupBuffer;
|
||||||
|
+
|
||||||
|
if (!mIsMainThread) {
|
||||||
|
// We can be destroyed from main thread even though we was created/used
|
||||||
|
// in compositor thread. We have to unref/delete WaylandDisplay in compositor
|
||||||
|
@@ -593,73 +609,64 @@ WindowSurfaceWayland::~WindowSurfaceWayl
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
-void
|
||||||
|
-WindowSurfaceWayland::UpdateScaleFactor()
|
||||||
|
-{
|
||||||
|
- wl_surface* waylandSurface = mWindow->GetWaylandSurface();
|
||||||
|
- if (waylandSurface) {
|
||||||
|
- wl_surface_set_buffer_scale(waylandSurface, mWindow->GdkScaleFactor());
|
||||||
|
- }
|
||||||
|
-}
|
||||||
|
-
|
||||||
|
WindowBackBuffer*
|
||||||
|
-WindowSurfaceWayland::GetFrontBufferToDraw(int aWidth, int aHeight)
|
||||||
|
+WindowSurfaceWayland::GetWaylandBufferToDraw(int aWidth, int aHeight)
|
||||||
|
{
|
||||||
|
- if (!mFrontBuffer) {
|
||||||
|
- mFrontBuffer = new WindowBackBuffer(mWaylandDisplay, aWidth, aHeight);
|
||||||
|
- mBackBuffer = new WindowBackBuffer(mWaylandDisplay, aWidth, aHeight);
|
||||||
|
- return mFrontBuffer;
|
||||||
|
+ if (!mWaylandBuffer) {
|
||||||
|
+ mWaylandBuffer = new WindowBackBuffer(mWaylandDisplay, aWidth, aHeight);
|
||||||
|
+ mBackupBuffer = new WindowBackBuffer(mWaylandDisplay, aWidth, aHeight);
|
||||||
|
+ return mWaylandBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (!mFrontBuffer->IsAttached()) {
|
||||||
|
- if (!mFrontBuffer->IsMatchingSize(aWidth, aHeight)) {
|
||||||
|
- mFrontBuffer->Resize(aWidth, aHeight);
|
||||||
|
+ if (!mWaylandBuffer->IsAttached()) {
|
||||||
|
+ if (!mWaylandBuffer->IsMatchingSize(aWidth, aHeight)) {
|
||||||
|
+ mWaylandBuffer->Resize(aWidth, aHeight);
|
||||||
|
// There's a chance that scale factor has been changed
|
||||||
|
// when buffer size changed
|
||||||
|
- UpdateScaleFactor();
|
||||||
|
+ mNeedScaleFactorUpdate = true;
|
||||||
|
}
|
||||||
|
- return mFrontBuffer;
|
||||||
|
+ return mWaylandBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Front buffer is used by compositor, draw to back buffer
|
||||||
|
- if (mBackBuffer->IsAttached()) {
|
||||||
|
+ if (mBackupBuffer->IsAttached()) {
|
||||||
|
NS_WARNING("No drawing buffer available");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
- MOZ_ASSERT(!mDelayedCommit,
|
||||||
|
+ MOZ_ASSERT(!mPendingCommit,
|
||||||
|
"Uncommitted buffer switch, screen artifacts ahead.");
|
||||||
|
|
||||||
|
- WindowBackBuffer *tmp = mFrontBuffer;
|
||||||
|
- mFrontBuffer = mBackBuffer;
|
||||||
|
- mBackBuffer = tmp;
|
||||||
|
+ WindowBackBuffer *tmp = mWaylandBuffer;
|
||||||
|
+ mWaylandBuffer = mBackupBuffer;
|
||||||
|
+ mBackupBuffer = tmp;
|
||||||
|
|
||||||
|
- if (mBackBuffer->IsMatchingSize(aWidth, aHeight)) {
|
||||||
|
+ if (mBackupBuffer->IsMatchingSize(aWidth, aHeight)) {
|
||||||
|
// Former front buffer has the same size as a requested one.
|
||||||
|
// Gecko may expect a content already drawn on screen so copy
|
||||||
|
// existing data to the new buffer.
|
||||||
|
- mFrontBuffer->SetImageDataFromBackBuffer(mBackBuffer);
|
||||||
|
+ mWaylandBuffer->SetImageDataFromBuffer(mBackupBuffer);
|
||||||
|
// When buffer switches we need to damage whole screen
|
||||||
|
// (https://bugzilla.redhat.com/show_bug.cgi?id=1418260)
|
||||||
|
- mFullScreenDamage = true;
|
||||||
|
+ mWaylandBufferFullScreenDamage = true;
|
||||||
|
} else {
|
||||||
|
// Former buffer has different size from the new request. Only resize
|
||||||
|
// the new buffer and leave gecko to render new whole content.
|
||||||
|
- mFrontBuffer->Resize(aWidth, aHeight);
|
||||||
|
+ mWaylandBuffer->Resize(aWidth, aHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
- return mFrontBuffer;
|
||||||
|
+ return mWaylandBuffer;
|
||||||
|
}
|
||||||
|
|
||||||
|
already_AddRefed<gfx::DrawTarget>
|
||||||
|
-WindowSurfaceWayland::LockFrontBuffer(int aWidth, int aHeight)
|
||||||
|
+WindowSurfaceWayland::LockWaylandBuffer(int aWidth, int aHeight)
|
||||||
|
{
|
||||||
|
- WindowBackBuffer* buffer = GetFrontBufferToDraw(aWidth, aHeight);
|
||||||
|
+ WindowBackBuffer* buffer = GetWaylandBufferToDraw(aWidth, aHeight);
|
||||||
|
if (buffer) {
|
||||||
|
return buffer->Lock();
|
||||||
|
}
|
||||||
|
|
||||||
|
- NS_WARNING("WindowSurfaceWayland::LockFrontBuffer(): No buffer available");
|
||||||
|
+ NS_WARNING("WindowSurfaceWayland::LockWaylandBuffer(): No buffer available");
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -687,8 +694,8 @@ WindowSurfaceWayland::LockImageSurface(c
|
||||||
|
A) Lock() is called to whole surface. In that case we don't need
|
||||||
|
to clip/buffer the drawing and we can return wl_buffer directly
|
||||||
|
for drawing.
|
||||||
|
- - mFrontBuffer is available - that's an ideal situation.
|
||||||
|
- - mFrontBuffer is locked by compositor - flip buffers and draw.
|
||||||
|
+ - mWaylandBuffer is available - that's an ideal situation.
|
||||||
|
+ - mWaylandBuffer is locked by compositor - flip buffers and draw.
|
||||||
|
- if we can't flip buffers - go B)
|
||||||
|
|
||||||
|
B) Lock() is requested for part(s) of screen. We need to provide temporary
|
||||||
|
@@ -704,30 +711,30 @@ WindowSurfaceWayland::Lock(const LayoutD
|
||||||
|
gfx::IntSize lockSize(bounds.XMost(), bounds.YMost());
|
||||||
|
|
||||||
|
// Are we asked for entire nsWindow to draw?
|
||||||
|
- mDirectWlBufferDraw = (aRegion.GetNumRects() == 1 &&
|
||||||
|
- bounds.x == 0 && bounds.y == 0 &&
|
||||||
|
- lockSize.width == screenRect.width &&
|
||||||
|
- lockSize.height == screenRect.height);
|
||||||
|
-
|
||||||
|
- if (mDirectWlBufferDraw) {
|
||||||
|
- RefPtr<gfx::DrawTarget> dt = LockFrontBuffer(screenRect.width,
|
||||||
|
- screenRect.height);
|
||||||
|
+ mDrawToWaylandBufferDirectly = (aRegion.GetNumRects() == 1 &&
|
||||||
|
+ bounds.x == 0 && bounds.y == 0 &&
|
||||||
|
+ lockSize.width == screenRect.width &&
|
||||||
|
+ lockSize.height == screenRect.height);
|
||||||
|
+
|
||||||
|
+ if (mDrawToWaylandBufferDirectly) {
|
||||||
|
+ RefPtr<gfx::DrawTarget> dt = LockWaylandBuffer(screenRect.width,
|
||||||
|
+ screenRect.height);
|
||||||
|
if (dt) {
|
||||||
|
return dt.forget();
|
||||||
|
}
|
||||||
|
|
||||||
|
// We don't have any front buffer available. Try indirect drawing
|
||||||
|
// to mImageSurface which is mirrored to front buffer at commit.
|
||||||
|
- mDirectWlBufferDraw = false;
|
||||||
|
+ mDrawToWaylandBufferDirectly = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return LockImageSurface(lockSize);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
-WindowSurfaceWayland::CommitImageSurface(const LayoutDeviceIntRegion& aRegion)
|
||||||
|
+WindowSurfaceWayland::CommitImageSurfaceToWaylandBuffer(const LayoutDeviceIntRegion& aRegion)
|
||||||
|
{
|
||||||
|
- MOZ_ASSERT(!mDirectWlBufferDraw);
|
||||||
|
+ MOZ_ASSERT(!mDrawToWaylandBufferDirectly);
|
||||||
|
|
||||||
|
LayoutDeviceIntRect screenRect = mWindow->GetBounds();
|
||||||
|
gfx::IntRect bounds = aRegion.GetBounds().ToUnknownRect();
|
||||||
|
@@ -737,8 +744,8 @@ WindowSurfaceWayland::CommitImageSurface
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
- RefPtr<gfx::DrawTarget> dt = LockFrontBuffer(screenRect.width,
|
||||||
|
- screenRect.height);
|
||||||
|
+ RefPtr<gfx::DrawTarget> dt = LockWaylandBuffer(screenRect.width,
|
||||||
|
+ screenRect.height);
|
||||||
|
RefPtr<gfx::SourceSurface> surf =
|
||||||
|
gfx::Factory::CreateSourceSurfaceForCairoSurface(mImageSurface->CairoSurface(),
|
||||||
|
mImageSurface->GetSize(),
|
||||||
|
@@ -766,92 +773,145 @@ WindowSurfaceWayland::CommitImageSurface
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
+static void
|
||||||
|
+WaylandBufferDelayCommitHandler(WindowSurfaceWayland **aSurface)
|
||||||
|
+{
|
||||||
|
+ if (*aSurface) {
|
||||||
|
+ (*aSurface)->DelayedCommitHandler();
|
||||||
|
+ } else {
|
||||||
|
+ // Referenced WindowSurfaceWayland is already deleted.
|
||||||
|
+ // Do nothing but just release the mDelayedCommitHandle allocated at
|
||||||
|
+ // WindowSurfaceWayland::CommitWaylandBuffer().
|
||||||
|
+ free(aSurface);
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
void
|
||||||
|
-WindowSurfaceWayland::Commit(const LayoutDeviceIntRegion& aInvalidRegion)
|
||||||
|
+WindowSurfaceWayland::CommitWaylandBuffer()
|
||||||
|
{
|
||||||
|
- MOZ_ASSERT(mIsMainThread == NS_IsMainThread());
|
||||||
|
+ MOZ_ASSERT(mPendingCommit, "Committing empty surface!");
|
||||||
|
|
||||||
|
wl_surface* waylandSurface = mWindow->GetWaylandSurface();
|
||||||
|
if (!waylandSurface) {
|
||||||
|
- // Target window is already destroyed - don't bother to render there.
|
||||||
|
- NS_WARNING("WindowSurfaceWayland::Commit(): parent wl_surface is already hidden/deleted.");
|
||||||
|
+ // Target window is not created yet - delay the commit. This can happen only
|
||||||
|
+ // when the window is newly created and there's no active
|
||||||
|
+ // frame callback pending.
|
||||||
|
+ MOZ_ASSERT(!mFrameCallback || waylandSurface != mLastCommittedSurface,
|
||||||
|
+ "Missing wayland surface at frame callback!");
|
||||||
|
+
|
||||||
|
+ // Do nothing if there's already mDelayedCommitHandle pending.
|
||||||
|
+ if (!mDelayedCommitHandle) {
|
||||||
|
+ mDelayedCommitHandle = static_cast<WindowSurfaceWayland**>(
|
||||||
|
+ moz_xmalloc(sizeof(*mDelayedCommitHandle)));
|
||||||
|
+ *mDelayedCommitHandle = this;
|
||||||
|
+
|
||||||
|
+ MessageLoop::current()->PostDelayedTask(
|
||||||
|
+ NewRunnableFunction("WaylandBackBufferCommit",
|
||||||
|
+ &WaylandBufferDelayCommitHandler,
|
||||||
|
+ mDelayedCommitHandle),
|
||||||
|
+ EVENT_LOOP_DELAY);
|
||||||
|
+ }
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
wl_proxy_set_queue((struct wl_proxy *)waylandSurface,
|
||||||
|
mWaylandDisplay->GetEventQueue());
|
||||||
|
|
||||||
|
- if (!mDirectWlBufferDraw) {
|
||||||
|
- // We have new content at mImageSurface - copy data to mFrontBuffer first.
|
||||||
|
- CommitImageSurface(aInvalidRegion);
|
||||||
|
+ // We have an active frame callback request so handle it.
|
||||||
|
+ if (mFrameCallback) {
|
||||||
|
+ if (waylandSurface == mLastCommittedSurface) {
|
||||||
|
+ // We have an active frame callback pending from our recent surface.
|
||||||
|
+ // It means we should defer the commit to FrameCallbackHandler().
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ // If our stored wl_surface does not match the actual one it means the frame
|
||||||
|
+ // callback is no longer active and we should release it.
|
||||||
|
+ wl_callback_destroy(mFrameCallback);
|
||||||
|
+ mFrameCallback = nullptr;
|
||||||
|
+ mLastCommittedSurface = nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
- if (mFullScreenDamage) {
|
||||||
|
+ if (mWaylandBufferFullScreenDamage) {
|
||||||
|
LayoutDeviceIntRect rect = mWindow->GetBounds();
|
||||||
|
wl_surface_damage(waylandSurface, 0, 0, rect.width, rect.height);
|
||||||
|
- mFullScreenDamage = false;
|
||||||
|
+ mWaylandBufferFullScreenDamage = false;
|
||||||
|
} else {
|
||||||
|
- for (auto iter = aInvalidRegion.RectIter(); !iter.Done(); iter.Next()) {
|
||||||
|
+ gint scaleFactor = mWindow->GdkScaleFactor();
|
||||||
|
+ for (auto iter = mWaylandBufferDamage.RectIter(); !iter.Done(); iter.Next()) {
|
||||||
|
const mozilla::LayoutDeviceIntRect &r = iter.Get();
|
||||||
|
- wl_surface_damage(waylandSurface, r.x, r.y, r.width, r.height);
|
||||||
|
+ // We need to remove the scale factor because the wl_surface_damage
|
||||||
|
+ // also multiplies by current scale factor.
|
||||||
|
+ wl_surface_damage(waylandSurface, r.x/scaleFactor, r.y/scaleFactor,
|
||||||
|
+ r.width/scaleFactor, r.height/scaleFactor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- // Frame callback is always connected to actual wl_surface. When the surface
|
||||||
|
- // is unmapped/deleted the frame callback is never called. Unfortunatelly
|
||||||
|
- // we don't know if the frame callback is not going to be called.
|
||||||
|
- // But our mozcontainer code deletes wl_surface when the GdkWindow is hidden
|
||||||
|
- // creates a new one when is visible.
|
||||||
|
- if (mFrameCallback && mFrameCallbackSurface == waylandSurface) {
|
||||||
|
- // Do nothing here - we have a valid wl_surface and the buffer will be
|
||||||
|
- // commited to compositor in next frame callback event.
|
||||||
|
- mDelayedCommit = true;
|
||||||
|
- return;
|
||||||
|
- } else {
|
||||||
|
- if (mFrameCallback) {
|
||||||
|
- // Delete frame callback connected to obsoleted wl_surface.
|
||||||
|
- wl_callback_destroy(mFrameCallback);
|
||||||
|
- }
|
||||||
|
+ // Clear all back buffer damage as we're committing
|
||||||
|
+ // all requested regions.
|
||||||
|
+ mWaylandBufferDamage.SetEmpty();
|
||||||
|
+
|
||||||
|
+ mFrameCallback = wl_surface_frame(waylandSurface);
|
||||||
|
+ wl_callback_add_listener(mFrameCallback, &frame_listener, this);
|
||||||
|
|
||||||
|
- mFrameCallback = wl_surface_frame(waylandSurface);
|
||||||
|
- wl_callback_add_listener(mFrameCallback, &frame_listener, this);
|
||||||
|
- mFrameCallbackSurface = waylandSurface;
|
||||||
|
-
|
||||||
|
- // There's no pending frame callback so we can draw immediately
|
||||||
|
- // and create frame callback for possible subsequent drawing.
|
||||||
|
- mFrontBuffer->Attach(waylandSurface);
|
||||||
|
- mDelayedCommit = false;
|
||||||
|
+ if (mNeedScaleFactorUpdate || mLastCommittedSurface != waylandSurface) {
|
||||||
|
+ wl_surface_set_buffer_scale(waylandSurface, mWindow->GdkScaleFactor());
|
||||||
|
+ mNeedScaleFactorUpdate = false;
|
||||||
|
}
|
||||||
|
+
|
||||||
|
+ mWaylandBuffer->Attach(waylandSurface);
|
||||||
|
+ mLastCommittedSurface = waylandSurface;
|
||||||
|
+
|
||||||
|
+ // There's no pending commit, all changes are sent to compositor.
|
||||||
|
+ mPendingCommit = false;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+void
|
||||||
|
+WindowSurfaceWayland::Commit(const LayoutDeviceIntRegion& aInvalidRegion)
|
||||||
|
+{
|
||||||
|
+ MOZ_ASSERT(mIsMainThread == NS_IsMainThread());
|
||||||
|
+
|
||||||
|
+ // We have new content at mImageSurface - copy data to mWaylandBuffer first.
|
||||||
|
+ if (!mDrawToWaylandBufferDirectly) {
|
||||||
|
+ CommitImageSurfaceToWaylandBuffer(aInvalidRegion);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // If we're not at fullscreen damage add drawing area from aInvalidRegion
|
||||||
|
+ if (!mWaylandBufferFullScreenDamage) {
|
||||||
|
+ mWaylandBufferDamage.OrWith(aInvalidRegion);
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // We're ready to commit.
|
||||||
|
+ mPendingCommit = true;
|
||||||
|
+ CommitWaylandBuffer();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
WindowSurfaceWayland::FrameCallbackHandler()
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(mIsMainThread == NS_IsMainThread());
|
||||||
|
+ MOZ_ASSERT(mFrameCallback != nullptr,
|
||||||
|
+ "FrameCallbackHandler() called without valid frame callback!");
|
||||||
|
+ MOZ_ASSERT(mLastCommittedSurface != nullptr,
|
||||||
|
+ "FrameCallbackHandler() called without valid wl_surface!");
|
||||||
|
|
||||||
|
- if (mFrameCallback) {
|
||||||
|
- wl_callback_destroy(mFrameCallback);
|
||||||
|
- mFrameCallback = nullptr;
|
||||||
|
- mFrameCallbackSurface = nullptr;
|
||||||
|
+ wl_callback_destroy(mFrameCallback);
|
||||||
|
+ mFrameCallback = nullptr;
|
||||||
|
+
|
||||||
|
+ if (mPendingCommit) {
|
||||||
|
+ CommitWaylandBuffer();
|
||||||
|
}
|
||||||
|
+}
|
||||||
|
|
||||||
|
- if (mDelayedCommit) {
|
||||||
|
- wl_surface* waylandSurface = mWindow->GetWaylandSurface();
|
||||||
|
- if (!waylandSurface) {
|
||||||
|
- // Target window is already destroyed - don't bother to render there.
|
||||||
|
- NS_WARNING("WindowSurfaceWayland::FrameCallbackHandler(): parent wl_surface is already hidden/deleted.");
|
||||||
|
- return;
|
||||||
|
- }
|
||||||
|
- wl_proxy_set_queue((struct wl_proxy *)waylandSurface,
|
||||||
|
- mWaylandDisplay->GetEventQueue());
|
||||||
|
+void
|
||||||
|
+WindowSurfaceWayland::DelayedCommitHandler()
|
||||||
|
+{
|
||||||
|
+ MOZ_ASSERT(mDelayedCommitHandle != nullptr, "Missing mDelayedCommitHandle!");
|
||||||
|
|
||||||
|
- // Send pending surface to compositor and register frame callback
|
||||||
|
- // for possible subsequent drawing.
|
||||||
|
- mFrameCallback = wl_surface_frame(waylandSurface);
|
||||||
|
- wl_callback_add_listener(mFrameCallback, &frame_listener, this);
|
||||||
|
- mFrameCallbackSurface = waylandSurface;
|
||||||
|
+ *mDelayedCommitHandle = nullptr;
|
||||||
|
+ free(mDelayedCommitHandle);
|
||||||
|
+ mDelayedCommitHandle = nullptr;
|
||||||
|
|
||||||
|
- mFrontBuffer->Attach(waylandSurface);
|
||||||
|
- mDelayedCommit = false;
|
||||||
|
+ if (mPendingCommit) {
|
||||||
|
+ CommitWaylandBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
diff -up firefox-62.0.3/widget/gtk/WindowSurfaceWayland.h.old firefox-62.0.3/widget/gtk/WindowSurfaceWayland.h
|
||||||
|
--- firefox-62.0.3/widget/gtk/WindowSurfaceWayland.h.old 2018-10-08 11:52:52.154376159 +0200
|
||||||
|
+++ firefox-62.0.3/widget/gtk/WindowSurfaceWayland.h 2018-09-06 11:01:18.802964787 +0200
|
||||||
|
@@ -74,7 +74,7 @@ public:
|
||||||
|
bool IsAttached() { return mAttached; }
|
||||||
|
|
||||||
|
bool Resize(int aWidth, int aHeight);
|
||||||
|
- bool SetImageDataFromBackBuffer(class WindowBackBuffer* aSourceBuffer);
|
||||||
|
+ bool SetImageDataFromBuffer(class WindowBackBuffer* aSourceBuffer);
|
||||||
|
|
||||||
|
bool IsMatchingSize(int aWidth, int aHeight)
|
||||||
|
{
|
||||||
|
@@ -111,28 +111,32 @@ public:
|
||||||
|
already_AddRefed<gfx::DrawTarget> Lock(const LayoutDeviceIntRegion& aRegion) override;
|
||||||
|
void Commit(const LayoutDeviceIntRegion& aInvalidRegion) final;
|
||||||
|
void FrameCallbackHandler();
|
||||||
|
+ void DelayedCommitHandler();
|
||||||
|
|
||||||
|
private:
|
||||||
|
- WindowBackBuffer* GetFrontBufferToDraw(int aWidth, int aHeight);
|
||||||
|
- void UpdateScaleFactor();
|
||||||
|
+ WindowBackBuffer* GetWaylandBufferToDraw(int aWidth, int aHeight);
|
||||||
|
|
||||||
|
- already_AddRefed<gfx::DrawTarget> LockFrontBuffer(int aWidth, int aHeight);
|
||||||
|
+ already_AddRefed<gfx::DrawTarget> LockWaylandBuffer(int aWidth, int aHeight);
|
||||||
|
already_AddRefed<gfx::DrawTarget> LockImageSurface(const gfx::IntSize& aLockSize);
|
||||||
|
- bool CommitImageSurface(const LayoutDeviceIntRegion& aRegion);
|
||||||
|
+ bool CommitImageSurfaceToWaylandBuffer(const LayoutDeviceIntRegion& aRegion);
|
||||||
|
+ void CommitWaylandBuffer();
|
||||||
|
|
||||||
|
// TODO: Do we need to hold a reference to nsWindow object?
|
||||||
|
nsWindow* mWindow;
|
||||||
|
nsWaylandDisplay* mWaylandDisplay;
|
||||||
|
- WindowBackBuffer* mFrontBuffer;
|
||||||
|
- WindowBackBuffer* mBackBuffer;
|
||||||
|
+ WindowBackBuffer* mWaylandBuffer;
|
||||||
|
+ LayoutDeviceIntRegion mWaylandBufferDamage;
|
||||||
|
+ WindowBackBuffer* mBackupBuffer;
|
||||||
|
RefPtr<gfxImageSurface> mImageSurface;
|
||||||
|
wl_callback* mFrameCallback;
|
||||||
|
- wl_surface* mFrameCallbackSurface;
|
||||||
|
+ wl_surface* mLastCommittedSurface;
|
||||||
|
MessageLoop* mDisplayThreadMessageLoop;
|
||||||
|
- bool mDirectWlBufferDraw;
|
||||||
|
- bool mDelayedCommit;
|
||||||
|
- bool mFullScreenDamage;
|
||||||
|
+ WindowSurfaceWayland** mDelayedCommitHandle;
|
||||||
|
+ bool mDrawToWaylandBufferDirectly;
|
||||||
|
+ bool mPendingCommit;
|
||||||
|
+ bool mWaylandBufferFullScreenDamage;
|
||||||
|
bool mIsMainThread;
|
||||||
|
+ bool mNeedScaleFactorUpdate;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace widget
|
Loading…
Reference in New Issue
Block a user