[tor-commits] [sandboxed-tor-browser/master] Bug 21055: Fall back gracefully if the Adwaita theme is not present.
yawning at torproject.org
yawning at torproject.org
Wed Dec 21 18:41:42 UTC 2016
commit 8aaa94a766a4154be4027a65aa86ad000d696f07
Author: Yawning Angel <yawning at schwanenlied.me>
Date: Wed Dec 21 18:33:18 2016 +0000
Bug 21055: Fall back gracefully if the Adwaita theme is not present.
This will look horrendous, because the default Gtk+-2.0 appearnce is
such, but it should work even on weird systems that don't have the
"Standard GNOME theme" installed.
---
ChangeLog | 1 +
README.md | 1 +
data/gtkrc-2.0-fallback | 1 +
.../internal/sandbox/application.go | 66 +++++++++++++++-------
4 files changed, 49 insertions(+), 20 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index f68edb8..ace155d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,5 @@
Changes in version 0.0.3 - UNRELEASED:
+ * Bug 21055: Fall back gracefully if the Adwaita theme is not present.
* Bug 20791: Fetch install/update metadata using onions.
* Bug 20979: runtime/cgo: pthread_create failed: Resource temporarily
unavailable.
diff --git a/README.md b/README.md
index c054980..9e1ec83 100644
--- a/README.md
+++ b/README.md
@@ -20,6 +20,7 @@ Runtime dependencies:
* bubblewrap >= 0.1.3 (https://github.com/projectatomic/bubblewrap).
* Gtk+ >= 3.14.0
* (Optional) PulseAudio
+ * (Optional) Adwaita Gtk+-2.0 theme
Build time dependencies:
diff --git a/data/gtkrc-2.0-fallback b/data/gtkrc-2.0-fallback
new file mode 100644
index 0000000..e3f6a86
--- /dev/null
+++ b/data/gtkrc-2.0-fallback
@@ -0,0 +1 @@
+gtk-font-name = "Arimo 11"
diff --git a/src/cmd/sandboxed-tor-browser/internal/sandbox/application.go b/src/cmd/sandboxed-tor-browser/internal/sandbox/application.go
index 4cff1c7..122e714 100644
--- a/src/cmd/sandboxed-tor-browser/internal/sandbox/application.go
+++ b/src/cmd/sandboxed-tor-browser/internal/sandbox/application.go
@@ -76,13 +76,9 @@ func RunTorBrowser(cfg *config.Config, manif *config.Manifest, tor *tor.Tor) (cm
if err = h.enableX11(cfg.Sandbox.Display); err != nil {
return
}
- h.roBind("/usr/share/themes/Adwaita/gtk-2.0", "/usr/share/themes/Adwaita/gtk-2.0", false)
- h.roBind("/usr/share/icons/Adwaita", "/usr/share/icons/Adwaita", false)
+ hasAdwaita := h.appendGtk2Theme()
h.roBind("/usr/share/icons/hicolor", "/usr/share/icons/hicolor", true)
h.roBind("/usr/share/mime", "/usr/share/mime", false)
- gtkRcPath := filepath.Join(h.homeDir, ".gtkrc-2.0")
- h.setenv("GTK2_RC_FILES", gtkRcPath)
- h.assetFile(gtkRcPath, "gtkrc-2.0")
pulseAudioWorks := false
if cfg.Sandbox.EnablePulseAudio {
@@ -261,7 +257,7 @@ func RunTorBrowser(cfg *config.Config, manif *config.Manifest, tor *tor.Tor) (cm
// Gtk uses plugin libraries and shit for theming, and expecting
// them to be in consistent locations, is too much to ask for.
- gtkExtraLibs, gtkLibPaths, err := h.appendRestrictedGtk2()
+ gtkExtraLibs, gtkLibPaths, err := h.appendRestrictedGtk2(hasAdwaita)
if err != nil {
return nil, err
}
@@ -640,7 +636,34 @@ func (h *hugbox) appendRestrictedOpenGL() ([]string, string) {
return nil, ""
}
-func (h *hugbox) appendRestrictedGtk2() ([]string, string, error) {
+func (h *hugbox) appendGtk2Theme() bool {
+ const (
+ themeDir = "/usr/share/themes/Adwaita/gtk-2.0"
+ iconDir = "/usr/share/themes/Adwaita"
+ adwaitaGtkrcAsset = "gtkrc-2.0"
+
+ fallbackGtkrcAsset = "gtkrc-2.0-fallback"
+ )
+
+ gtkRc := fallbackGtkrcAsset
+
+ hasAdwaita := DirExists(themeDir) && DirExists(iconDir)
+ if hasAdwaita {
+ h.roBind("/usr/share/themes/Adwaita/gtk-2.0", "/usr/share/themes/Adwaita/gtk-2.0", false)
+ h.roBind("/usr/share/icons/Adwaita", "/usr/share/icons/Adwaita", false)
+ gtkRc = adwaitaGtkrcAsset
+ } else {
+ log.Printf("sandbox: Failed to find Adwaita gtk-2.0 theme.")
+ }
+
+ gtkRcPath := filepath.Join(h.homeDir, ".gtkrc-2.0")
+ h.setenv("GTK2_RC_FILES", gtkRcPath)
+ h.assetFile(gtkRcPath, gtkRc)
+
+ return hasAdwaita
+}
+
+func (h *hugbox) appendRestrictedGtk2(hasAdwaita bool) ([]string, string, error) {
const (
libAdwaita = "libadwaita.so"
libPixmap = "libpixmap.so"
@@ -656,21 +679,24 @@ func (h *hugbox) appendRestrictedGtk2() ([]string, string, error) {
gtkLibPath := ""
setGtkPath := false
- // Figure out where the system keeps the Gtk+-2.0 theme libraries,
- // and bind mount in Adwaita and Pixmap.
normGtkDir := filepath.Join(restrictedLibDir, "gtk-2.0", "2.10.0")
- adwaitaPath := findDistributionDependentLibs(nil, engineSubDir, libAdwaita)
- if adwaitaPath != "" {
- gtkEngineDir, _ := filepath.Split(adwaitaPath)
- normGtkEngineDir := filepath.Join(normGtkDir, "engines")
- h.roBind(adwaitaPath, filepath.Join(normGtkEngineDir, libAdwaita), false)
- h.roBind(filepath.Join(gtkEngineDir, libPixmap), filepath.Join(normGtkEngineDir, libPixmap), true)
- setGtkPath = true
- gtkLibs = append(gtkLibs, libAdwaita)
- gtkLibPath = gtkLibPath + ":" + gtkEngineDir
- } else {
- log.Printf("sandbox: Failed to find gtk-2.0 libadwaita.so.")
+ // Figure out where the system keeps the Gtk+-2.0 theme libraries,
+ // and bind mount in Adwaita and Pixmap.
+ if hasAdwaita {
+ adwaitaPath := findDistributionDependentLibs(nil, engineSubDir, libAdwaita)
+ if adwaitaPath != "" {
+ gtkEngineDir, _ := filepath.Split(adwaitaPath)
+ normGtkEngineDir := filepath.Join(normGtkDir, "engines")
+ h.roBind(adwaitaPath, filepath.Join(normGtkEngineDir, libAdwaita), false)
+ h.roBind(filepath.Join(gtkEngineDir, libPixmap), filepath.Join(normGtkEngineDir, libPixmap), true)
+
+ setGtkPath = true
+ gtkLibs = append(gtkLibs, libAdwaita)
+ gtkLibPath = gtkLibPath + ":" + gtkEngineDir
+ } else {
+ log.Printf("sandbox: Failed to find gtk-2.0 libadwaita.so.")
+ }
}
// Figure out where the system keeps the Gtk+-2.0 print backends,
More information about the tor-commits
mailing list