Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/bockbuild.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Bockover <aaron@abock.org>2011-03-07 20:10:38 +0300
committerAaron Bockover <aaron@abock.org>2011-03-07 20:10:38 +0300
commitbc6a85530c7dfd744ef23face80e3a591834cb58 (patch)
treee9d83e30262e03d8db7385cebb4a3eaa4ebd6a6f
parentfbada188cfee2e82463af9fe639fc869daad2ccb (diff)
parent8a4f48d01667362319905471eae23b913c471082 (diff)
Merged Bertrand's linux bundle work
-rw-r--r--.gitignore1
-rw-r--r--bockbuild/glickprofile.py44
-rw-r--r--bockbuild/package.py2
-rw-r--r--packages/banshee.py1
-rw-r--r--packages/mono-addins.py2
-rw-r--r--packages/mono.py2
-rw-r--r--profiles/banshee/README.linux-bundle53
-rwxr-xr-xprofiles/banshee/linux-bundle.py83
-rw-r--r--profiles/banshee/packages.py3
-rw-r--r--profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/Panels/panel-bg-dark.pngbin0 -> 184 bytes
-rw-r--r--profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/gtkrc542
-rw-r--r--profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/panel.rc63
-rwxr-xr-xprofiles/banshee/skeleton.glick/start40
-rw-r--r--solitary/Entry.cs5
-rw-r--r--solitary/Item.cs25
-rw-r--r--solitary/NativeLibraryItem.cs6
-rw-r--r--solitary/ProcessTools.cs29
-rw-r--r--solitary/Solitary.cs2
18 files changed, 893 insertions, 10 deletions
diff --git a/.gitignore b/.gitignore
index a64593f..49e4ed5 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
profiles/*/build-root
+profiles/*/bundle.glick
solitary/Options.cs
solitary/Solitary.exe*
diff --git a/bockbuild/glickprofile.py b/bockbuild/glickprofile.py
new file mode 100644
index 0000000..65d49fb
--- /dev/null
+++ b/bockbuild/glickprofile.py
@@ -0,0 +1,44 @@
+import os
+import shutil
+from plistlib import Plist
+from util import *
+from unixprofile import UnixProfile
+
+class GlickProfile (UnixProfile):
+ def __init__ (self):
+ UnixProfile.__init__ (self)
+
+ self.name = 'glick'
+ self.prefix = '/proc/self/fd/1023'
+ self.env.set ('BUILD_PREFIX', self.prefix)
+
+ self.glick_path = '/usr/bin/mkglick'
+
+ if not os.path.exists (self.glick_path):
+ raise IOError ('Glick is not installed (http://www.gnome.org/~alexl/glick/): %s' \
+ % self.glick_path)
+
+ if not os.path.exists (self.prefix):
+ raise IOError ('We are not running in a glick magic shell')
+
+ def bundle (self):
+ self.make_app_bundle ()
+
+ def make_app_bundle (self):
+ start_path = os.path.join (self.bundle_skeleton_dir, 'start')
+ if not os.path.exists (start_path):
+ print 'Warning: no start script in glick skeleton'
+
+ # Create the bundle, copying the skeleton
+ shutil.rmtree (self.bundle_output_dir, ignore_errors = True)
+ shutil.copytree (self.bundle_skeleton_dir, self.bundle_output_dir)
+
+ # Run solitary against the installation to collect files
+ files = ''
+ for file in self.bundle_from_build:
+ files = files + ' "%s"' % os.path.join (self.prefix, file)
+
+ run_shell ('mono --debug ../../solitary/Solitary.exe '
+ '--mono-prefix="%s" --root="%s" --out="%s" %s' % \
+ (self.prefix, self.prefix, self.bundle_output_dir, files))
+
diff --git a/bockbuild/package.py b/bockbuild/package.py
index 9dda186..d16ef7b 100644
--- a/bockbuild/package.py
+++ b/bockbuild/package.py
@@ -28,7 +28,7 @@ class Package:
if self.source_dir_name == None:
self.source_dir_name = '%{name}-%{version}'
- self.prefix = os.path.join (Package.profile.build_root, '_install')
+ self.prefix = Package.profile.prefix
self.configure = './configure --prefix="%{prefix}"'
self.make = 'make -j%s' % Package.profile.cpu_count
self.makeinstall = 'make install'
diff --git a/packages/banshee.py b/packages/banshee.py
index 4a2932a..754370e 100644
--- a/packages/banshee.py
+++ b/packages/banshee.py
@@ -16,6 +16,7 @@ class BansheePackage (Package):
]
self.configure_flags.extend ([
+ '--disable-hal',
'--disable-mtp',
'--disable-daap',
'--disable-ipod',
diff --git a/packages/mono-addins.py b/packages/mono-addins.py
index 22338b4..4f784a7 100644
--- a/packages/mono-addins.py
+++ b/packages/mono-addins.py
@@ -1,4 +1,6 @@
Package ('mono-addins', '0.5',
sources = [ 'http://ftp.novell.com/pub/mono/sources/%{name}/%{name}-%{version}.tar.bz2' ],
+ configure_flags = ['--disable-gui'],
+
override_properties = { 'make': 'make' }
)
diff --git a/packages/mono.py b/packages/mono.py
index 568f818..83ee2da 100644
--- a/packages/mono.py
+++ b/packages/mono.py
@@ -15,7 +15,7 @@ class MonoPackage (Package):
)
# Mono (in libgc) likes to fail to build randomly
- self.make = 'for((i=0;i<20;i++)); do make && break; done'
+ self.make = 'for i in 1 2 3 4 5 6 7 8 9 10; do make && break; done'
# def prep (self):
# Package.prep (self)
diff --git a/profiles/banshee/README.linux-bundle b/profiles/banshee/README.linux-bundle
new file mode 100644
index 0000000..c2ec40f
--- /dev/null
+++ b/profiles/banshee/README.linux-bundle
@@ -0,0 +1,53 @@
+Making a bundle for linux:
+
+In order to make a bundle for linux that can be run from any directory, we'll use
+glick, which is available at http://people.gnome.org/~alexl/glick/.
+Glick uses a trick that allows the bundle to find all its files via an absolute
+pathname (/proc/self/fd/1023), making everything much easier. The build process
+below will configure everything with "--prefix=/proc/self/fd/1023".
+So you need to have glick installed in order to proceed.
+
+ - If this is not your first time using bockbuild, remove your build-root
+ directory; If you intend to release the bundle you should rebuild the whole
+ world to ensure no regressions or build quirks were introduced during
+ any testing
+
+ - Spawn a magic shell in which we will run the whole process. In this shell,
+ /proc/self/fd/1023 is a link to the directory where everything will be
+ installed.
+
+ $ mkdir -p build-root/_install
+ $ glick-shell build-root/_install
+
+ - Start the release build process:
+
+ $ ./linux-bundle.py -bvr
+
+ - Compile solitary:
+
+ $ ./linux-bundle.py -e > linux-bundle.env
+ $ source linux-bundle.env
+ $ pushd ../../solitary
+ $ make
+ $ popd
+
+ - Start the bundling process. This will also copy the content of skeleton.glick/
+ into the bundle directory.
+
+ $ ./linux-bundle.py -z
+
+ - Exit the magic shell to get back to a regular environment.
+
+ $ exit
+
+ - Build the ext2 filesystem image containing everything under the bundle.glick
+ directory. This needs to be run as root because it uses loopback mounts. You
+ might have to replace the first line of the glick-mkext2 with "#!/bin/bash"
+ if bash is not you default shell.
+
+ # sudo glick-mkext2 image.ext2 bundle.glick
+
+ - Build the glick file, which is an ELF executable containing the ext2 image.
+
+ $ mkglick banshee.run image.ext2
+
diff --git a/profiles/banshee/linux-bundle.py b/profiles/banshee/linux-bundle.py
new file mode 100755
index 0000000..5ab0fd3
--- /dev/null
+++ b/profiles/banshee/linux-bundle.py
@@ -0,0 +1,83 @@
+#!/usr/bin/python -B
+
+import os
+import sys
+
+sys.path.append ('../..')
+
+from bockbuild.glickprofile import GlickProfile
+from packages import BansheePackages
+
+class BansheeLinuxBundleProfile (GlickProfile, BansheePackages):
+ def __init__ (self):
+ GlickProfile.__init__ (self)
+ BansheePackages.__init__ (self)
+
+ import os
+ if not os.path.isdir ('/usr/include/alsa'):
+ raise IOError ('You must have the ALSA headers installed. (/usr/include/alsa)')
+
+ self_dir = os.path.realpath (os.path.dirname (sys.argv[0]))
+ self.bundle_skeleton_dir = os.path.join (self_dir, 'skeleton.glick')
+ self.bundle_output_dir = os.path.join (self_dir, 'bundle.glick')
+
+ self.bundle_from_build = [
+ 'bin/mono',
+ 'lib/mono/2.0/gmcs.exe',
+ 'lib/mono/gac/Mono.Addins.CecilReflector',
+ 'lib/banshee-1',
+ 'lib/pango',
+ 'lib/gtk-2.0/2.10.0/loaders',
+ 'lib/gtk-2.0/2.10.0/engines',
+ 'lib/gtk-2.0/2.10.0/immodules',
+ 'lib/gdk-pixbuf-2.0/2.10.0/loaders',
+ 'lib/gdk-pixbuf-2.0/2.10.0/loaders.cache',
+ 'lib/gstreamer-0.10',
+ 'share/banshee-1',
+ 'share/locale',
+ 'etc/gtk-2.0',
+ 'etc/mono/config',
+ 'etc/mono/2.0/machine.config',
+ 'etc/mono/2.0/settings.map',
+ 'etc/pango/pango.modules',
+ 'share/icons/hicolor/index.theme',
+ 'share/icons/Tango/index.theme'
+ ]
+
+ self.bundle_from_build.extend ([
+ 'share/icons/%s/%sx%s' % (theme, size, size)
+ for size in [16, 22, 32, 48]
+ for theme in ['hicolor', 'Tango']
+ ])
+
+ def bundle (self):
+ banshee_path = os.path.join (self.prefix, 'lib', 'banshee-1')
+ os.environ['MONO_PATH'] = ':'.join ([
+ banshee_path,
+ os.path.join (banshee_path, 'Extensions'),
+ os.path.join (banshee_path, 'Backends')
+ ])
+
+ GlickProfile.bundle (self)
+
+ import shutil
+ import glob
+
+ for nuke in [ 'AudioCd', 'Dap', 'Dap.MassStorage' ]:
+ for path in glob.glob (os.path.join (self.bundle_output_dir,
+ 'lib', 'banshee-1', 'Extensions', 'Banshee.%s*' % nuke)):
+ os.unlink (path)
+
+ for nuke in [ 'gtk20-properties.mo', 'gettext-tools.mo' ]:
+ for path in glob.glob (os.path.join (self.bundle_output_dir,
+ 'share', 'locale', '*', 'LC_MESSAGES', '%s' % nuke)):
+ os.unlink (path)
+
+ for nuke in [ 'banshee-1', 'banshee-1/gstreamer-0.10',
+ 'gdk-pixbuf-2.0/2.10.0/loaders', 'gtk-2.0/2.10.0/engines' ]:
+ for path in glob.glob (os.path.join (self.bundle_output_dir,
+ 'lib', '%s' % nuke, '*.a')):
+ os.unlink (path)
+
+if __name__ == '__main__':
+ BansheeLinuxBundleProfile ().build ()
diff --git a/profiles/banshee/packages.py b/profiles/banshee/packages.py
index 28656a4..0ad00e9 100644
--- a/profiles/banshee/packages.py
+++ b/profiles/banshee/packages.py
@@ -1,6 +1,7 @@
import os
from bockbuild.darwinprofile import DarwinProfile
from bockbuild.gnomeprofile import GnomeProfile
+from bockbuild.glickprofile import GlickProfile
class BansheePackages:
def __init__ (self):
@@ -29,8 +30,6 @@ class BansheePackages:
'gdk-pixbuf.py',
'gtk+.py',
'gconf-dummy.py',
- 'cmake.py',
- 'libproxy.py',
'libgpg-error.py',
'libgcrypt.py',
'gnutls.py',
diff --git a/profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/Panels/panel-bg-dark.png b/profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/Panels/panel-bg-dark.png
new file mode 100644
index 0000000..37c7f9b
--- /dev/null
+++ b/profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/Panels/panel-bg-dark.png
Binary files differ
diff --git a/profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/gtkrc b/profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/gtkrc
new file mode 100644
index 0000000..650a4e5
--- /dev/null
+++ b/profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/gtkrc
@@ -0,0 +1,542 @@
+# Author: perfectska04 (Victor C.)
+# Theme: Shiki-Colors for Murrine 0.9.3+.
+# Description: Shiki-Colors is 100% free and open source.
+
+# NOTE: Uncommenting means to delete the "#" at the beginning of a line. Commenting means to add a "#" at the beginning of a line. The "#" tells the theme wether to ignore the specified line or not.
+
+# These are the defined colors for the theme, you can change them in GNOME's appearance preferences.
+gtk_color_scheme = "fg_color:#101010\nbg_color:#D8D8D8\nbase_color:#fff\ntext_color:#1A1A1A\nselected_bg_color:#729FCF\nselected_fg_color:#fff\ntooltip_bg_color:#F5F5B5\ntooltip_fg_color:#000\nframe_color:#333333\ninactive_frame_color:#333333"
+
+#########
+# ICONS
+#########
+gtk-icon-sizes = "gtk-button=16,16" # This makes button icons smaller.
+#gtk-icon-sizes = "gtk-large-toolbar=16,16:gtk-small-toolbar=16,16:panel-menu=16,16:gtk-button=16,16" # This enables "compact-mode".
+#gtk-button-images = 0 # Enables or disables icons on buttons (OS X-like).
+#gtk-menu-popup-delay = 1 # Makes menus pop up faster! Set to 1 instead of 0 to avoid any bugs.
+
+##########
+# PANELS
+##########
+include "panel.rc" # This includes the file that handles panel theming. Gradient panel backgrounds are enabled by default for this setting. Please edit panel.rc if you don't want gradient backgrounds in your panels, or plan to use transparent/custom panels.
+
+# The following lines make panel-menu-applet, slab-main-menu and gimmie applet's text bold. The radius value sets the roundness value of the selected menu-item.
+style "bold-panel-menu"
+{
+ font_name = "Bold"
+
+ engine "murrine" {
+ roundness = 2
+ }
+}
+
+style "bold-panel-slab"
+{
+ font_name = "Bold"
+}
+widget "*Panel*slab-main-menu-panel-button*" style "bold-panel-slab"
+widget "*gimmie*" style "bold-panel-slab"
+widget "*Panel*MenuBar*" style "bold-panel-menu"
+
+##########################
+# GENERAL THEME SETTINGS
+##########################
+style "murrine-default"
+{
+ xthickness = 1
+ ythickness = 1
+
+ GtkButton::child-displacement-x = 0 # Pressed button icon displacement.
+ GtkButton::child-displacement-y = 1 # Pressed button icon displacement.
+
+ GtkButton::default-border = { 0, 0, 0, 0 }
+ GtkCheckButton::indicator-size = 14 # Size for check buttons.
+ GtkRadioButton::indicator-size = 14 # Size for radio buttons.
+ GtkPaned::handle-size = 6 # Width of handles.
+
+ GtkRange::trough-border = 0
+ GtkRange::slider-width = 15 # Scrollbar width.
+ GtkRange::stepper-size = 15 # Stepper height.
+
+ GtkScale::slider-length = 24 # Length of sliders.
+ GtkScale::trough-side-details = 1
+ GtkScrollbar::min-slider-length = 35 # Min. length of scrollbars.
+
+ GtkMenuBar::internal-padding = 0
+ GtkExpander::expander-size = 16
+ GtkToolbar::internal-padding = 1 # Toolbar padding.
+ GtkTreeView::expander-size = 14
+ GtkTreeView::vertical-separator = 0
+
+ GtkMenu::horizontal-padding = 0
+ GtkMenu::vertical-padding = 0
+
+ WnckTasklist::fade-overlay-rect = 0
+ GtkEntry::honors-transparent-bg-hint = 1
+ GtkEntry::progress-border = { 2, 2, 2, 2 } # Border of GtkEntry progressbars.
+
+# GtkWidget::focus-padding = 0 # This can give you a more compact appearance.
+ GtkScrolledWindow::scrollbar-spacing = 1 # This sets the spacing between scrollbars.
+
+# Uncomment one or both of the following for flat/unified menus or toolbars:
+ GtkToolbar::shadow-type = GTK_SHADOW_NONE # Makes toolbars flat and unified.
+# GtkMenuBar::shadow-type = GTK_SHADOW_NONE # Makes menus flat and unified.
+
+ ####################
+ # Color Definitions
+ ####################
+ fg[NORMAL] = @fg_color
+ fg[PRELIGHT] = @fg_color
+ fg[SELECTED] = @selected_fg_color
+ fg[ACTIVE] = @fg_color
+ fg[INSENSITIVE] = darker (@bg_color)
+
+ bg[NORMAL] = @bg_color
+ bg[PRELIGHT] = shade (1.02, @bg_color)
+ bg[SELECTED] = @selected_bg_color
+ bg[INSENSITIVE] = @bg_color
+ bg[ACTIVE] = shade (0.85, @bg_color)
+
+ base[NORMAL] = @base_color
+ base[PRELIGHT] = shade (0.95, @bg_color)
+ base[ACTIVE] = shade (0.75, @bg_color)
+ base[SELECTED] = @selected_bg_color
+ base[INSENSITIVE] = @bg_color
+
+ text[NORMAL] = @text_color
+ text[PRELIGHT] = @text_color
+ text[ACTIVE] = @selected_fg_color
+ text[SELECTED] = @selected_fg_color
+ text[INSENSITIVE] = darker (@bg_color)
+
+ engine "murrine"
+ {
+ contrast = 1.0 # theme contrast.
+ glazestyle = 0 # 0 = flat hilight, 1 = curved hilight, 2 = concave style, 3 = top curved hilight, 4 = beryl hilight.
+ menubarstyle = 0 # 0 = flat, 1 = glassy, 2 = gradient, 3 = striped.
+ menubaritemstyle = 1 # 0 = menuitem look, 1 = button look.
+ menuitemstyle = 1 # 0 = flat, 1 = glassy, 2 = striped.
+ listviewheaderstyle = 1 # 0 = flat, 1 = glassy, 2 = raised.
+ listviewstyle = 0 # 0 = nothing, 1 = dotted.
+ scrollbarstyle = 2 # 0 = nothing, 1 = circles, 2 = handles, 3 = diagonal stripes, 4 = diagonal stripes and handles, 5 = horizontal stripes, 6 = horizontal stripes and handles.
+ stepperstyle = 1 # 0 = standard, 1 = integrated stepper handles.
+ roundness = 2 # Overall roundness of the theme.
+# progressbarstyle = 1 # 0 = nothing, 1 = striped, 2 = cells
+ animation = TRUE # FALSE disables progressbar animations.
+ #gradients = TRUE # enables gradients.
+ reliefstyle = 2 # shadows around widgets.
+ sliderstyle = 1 # 0 = nothing added, 1 = handles.
+ menustyle = 0 # removes stripes from menus.
+ rgba = FALSE # disables rgba.
+ lightborder_shade = 1.20 # sets lightborder amount for buttons or widgets.
+ lightborderstyle = 1 # 0 = lightborder on top side, 1 = lightborder on all sides.
+ highlight_shade = 1.04 # shade for gradient hightlight.
+ gradient_shades = {1.09,1.01,1.01,0.91} # rendering of gradients.
+ }
+}
+
+#################
+# THEME MODULES
+#################
+style "evolution-hack" = "murrine-default" # Hacks for Evolution Mail.
+{
+ bg[NORMAL] = shade (1.14, @bg_color) # Color for evo treeview headers.
+ bg[PRELIGHT] = shade (1.18, @bg_color) # Color for evo treeview header prelight.
+ bg[ACTIVE] = shade (0.75, @bg_color) # Color for unfocused evo selected items.
+ bg[SELECTED] = @selected_bg_color # Color for evo selected items.
+ fg[ACTIVE] = @selected_fg_color # Color for evo active text.
+ fg[SELECTED] = @selected_fg_color # Color for evo selected text.
+}
+
+style "murrine-wide"
+{
+ xthickness = 2 # Can't change, or clowns will eat you.
+ ythickness = 2 # Can't change, or clowns will eat you.
+}
+
+style "murrine-wider"
+{
+ xthickness = 3 # Can't change, or clowns will eat you.
+ ythickness = 3 # Can't change, or clowns will eat you.
+}
+
+style "murrine-entry" = "murrine-wider" {
+
+ bg[SELECTED] = mix (0.4, @selected_bg_color, @base_color)
+ fg[SELECTED] = @text_color
+
+ engine "murrine" {
+ focus_color = shade (0.65, @selected_bg_color)
+ }
+}
+
+style "murrine-button" = "murrine-wider"
+{
+ bg[NORMAL] = shade (1.14, @bg_color) # Color for buttons.
+ bg[PRELIGHT] = shade (1.18, @bg_color) # Color for button-prelight.
+ bg[ACTIVE] = shade (0.85, @bg_color) # Color for pressed-buttons.
+ engine "murrine"
+ {
+ contrast = 1.20 # Button border contrast.
+ }
+}
+
+style "murrine-notebook-bg"
+{
+ bg[NORMAL] = shade (1.1, @bg_color) # Tab background.
+ bg[ACTIVE] = @bg_color # Unfocused tab background.
+}
+
+style "murrine-notebook" = "murrine-notebook-bg"
+{
+ xthickness = 2 # Width of tabs and notebook borders.
+ ythickness = 2 # Height of tabs and notebook borders.
+ engine "murrine"
+ {
+ roundness = 0 # Roundness of notebook tabs.
+ }
+}
+
+style "murrine-menu" # This section themes custom dark menus. Leave as is.
+{
+ ythickness = 0
+ xthickness = 0
+ bg[SELECTED] = shade (0.85, @selected_bg_color)
+ bg[NORMAL] = "#3C3C3C"
+ bg[PRELIGHT] = shade (0.85, @selected_bg_color)
+ bg[ACTIVE] = "#333333"
+ bg[INSENSITIVE] = "#3C3C3C"
+ fg[NORMAL] = "#E6E6E6" # Color for normal text.
+ fg[PRELIGHT] = @selected_fg_color
+ fg[SELECTED] = @selected_fg_color
+ fg[ACTIVE] = @selected_fg_color
+ fg[INSENSITIVE] = "#666666"
+ text[NORMAL] = @base_color # Color for menu-item radio/checks.
+ base[NORMAL] = "#666666" # Color for menu-item radio/checks background.
+ text[PRELIGHT] = @selected_fg_color
+ text[SELECTED] = @selected_fg_color
+ text[ACTIVE] = @selected_fg_color
+ text[INSENSITIVE] = "#666666"
+ engine "murrine"
+ {
+ roundness = 0 # Roundness of menu items.
+ }
+}
+
+style "murrine-menu-item" = "murrine-wider"
+{
+ bg[SELECTED] = shade (0.85, @selected_bg_color)
+ bg[PRELIGHT] = shade (0.85, @selected_bg_color)
+ fg[NORMAL] = "#E6E6E6" # Fix for XFCE menu text.
+ fg[PRELIGHT] = @selected_fg_color
+ fg[SELECTED] = @selected_fg_color
+}
+
+style "murrine-separator-menu-item"
+{
+ GtkSeparatorMenuItem::horizontal-padding = 4
+ # We are setting the desired height by using wide-separators.
+ # There is no other way to get the odd height ...
+ GtkWidget::wide-separators = 1
+ GtkWidget::separator-width = 1
+ GtkWidget::separator-height = 7
+ xthickness = 1
+ ythickness = 0
+}
+
+style "murrine-menubar" # This section deals with dark menubars. Leave as is.
+{
+ ythickness = 0
+ bg[SELECTED] = shade (0.85, @selected_bg_color)
+ bg[NORMAL] = "#3C3C3C" # Background color for menubars.
+ bg[PRELIGHT] = shade (0.85, @selected_bg_color)
+ bg[ACTIVE] = "#333333"
+ bg[INSENSITIVE] = "#3C3C3C"
+ fg[NORMAL] = "#E6E6E6" # Color for normal text.
+ fg[PRELIGHT] = @selected_fg_color
+ fg[SELECTED] = @selected_fg_color
+ fg[ACTIVE] = @selected_fg_color
+ fg[INSENSITIVE] = "#666666"
+ text[NORMAL] = "#E6E6E6"
+ text[PRELIGHT] = @selected_fg_color
+ text[SELECTED] = @selected_fg_color
+ text[ACTIVE] = @selected_fg_color
+ text[INSENSITIVE] = "#666666"
+}
+
+style "murrine-treeview"
+{
+ engine "murrine"
+ {
+ roundness = 0 # This makes treeview progressbars square.
+ }
+}
+
+style "murrine-treeview-header" = "murrine-button"
+{
+ xthickness = 2
+ ythickness = 1
+ bg[NORMAL] = shade (1.14, @bg_color) # Color for treeview headers.
+ bg[PRELIGHT] = shade (1.18, @bg_color) # Color for treeview header prelight.
+ bg[ACTIVE] = shade (0.85, @bg_color) # Color for pressed-treeview.
+ engine "murrine"
+ {
+ roundness = 0 # This makes treeview progressbars square.
+ }
+}
+
+style "murrine-frame-title"
+{
+ fg[NORMAL] = lighter (@fg_color)
+}
+
+style "murrine-tooltips" = "murrine-wider"
+{
+ bg[NORMAL] = @tooltip_bg_color
+ fg[NORMAL] = @tooltip_fg_color
+}
+
+style "metacity-frame" = "murrine-default"
+{
+ bg[SELECTED] = shade (0.85, @selected_bg_color) # Color for metacity borders.
+}
+
+style "murrine-progressbar"
+{
+ xthickness = 0
+ ythickness = 0
+ fg[PRELIGHT] = @selected_fg_color # Progressbar prelighted text.
+ engine "murrine"
+ {
+ roundness = 0 # Progressbar roundness.
+ }
+}
+
+style "murrine-statusbar"
+{
+ xthickness = 2
+}
+
+style "murrine-comboboxentry"
+{
+}
+
+style "murrine-spinbutton"
+{
+ bg[ACTIVE] = shade (0.85, @bg_color) # Color for pressed-spinbuttons.
+}
+
+style "murrine-scale" = "murrine-button"
+{
+ GtkRange ::slider-width = 15 # Width of sliders.
+ bg[NORMAL] = shade (1.14, @bg_color) # Color for sliders.
+ bg[PRELIGHT] = shade (1.18, @bg_color) # Color for slider prelight.
+ bg[ACTIVE] = shade (0.85, @bg_color) # Color for pressed-sliders.
+ engine "murrine"
+ {
+ contrast = 1.20 # Slider border contrast.
+ }
+}
+
+style "murrine-hscale" = "murrine-scale"
+{
+}
+
+style "murrine-vscale" = "murrine-scale"
+{
+}
+
+style "murrine-nautilus-location" # Workaround for nautilus' messages.
+{
+ bg[NORMAL] = shade (1.25, @selected_bg_color)
+}
+
+style "murrine-radiocheck" = "murrine-default"
+{
+ text[NORMAL] = @selected_fg_color # Color for checks/radio items.
+ text[PRELIGHT] = @selected_fg_color # Color for checks/radio items.
+}
+
+##############
+# SCROLLBARS
+##############
+style "murrine-scrollbar"
+{
+# GtkScrollbar::trough-border = 0 # Change to a higher value for border around scrollbars.
+ bg[NORMAL] = shade (1.14, @bg_color) # Color for non-colored scrollbars.
+ bg[INSENSITIVE] = @bg_color # Color for non-colored scrollbars.
+ bg[PRELIGHT] = @bg_color # Color for scrollbar prelight? (probably obsolete)
+ bg[ACTIVE] = @bg_color # Color for scrollbar rail's background.
+ bg[SELECTED] = @selected_bg_color # Color of scrollbars.
+ fg[PRELIGHT] = shade (0.60, @selected_bg_color) # Highlighted scrollbar button.
+ fg[ACTIVE] = shade (0.40, @selected_bg_color) # Pressed scrollbar button.
+ engine "murrine"
+ {
+ colorize_scrollbar = FALSE # Commenting this out gives you colorful scrollbars.
+ roundness = 0 # Scrollbar roundness.
+ contrast = 1.20 # Makes scrollbar's rail borders darker.
+ }
+}
+
+style "murrine-hscrollbar" = "murrine-scrollbar"
+{
+}
+
+style "murrine-vscrollbar" = "murrine-scrollbar"
+{
+}
+
+############
+# TOOLBARS
+############
+# Gradient toolbars are disabled for this theme. Follow these instructions to enable them:
+# 1. Comment out the line in this file that starts with "GtkToolbar::shadow-type".
+# 2. Uncomment the following:
+
+#style "murrine-toolbar" = "murrine-default"
+#{
+# engine "murrine"
+# {
+# toolbarstyle = 2 # This forces gradient toolbars.
+# }
+#}
+
+#style "murrine-evo-new-button-workaround"
+#{
+# engine "murrine"
+# {
+# toolbarstyle = 0
+# }
+#}
+#widget_class "EShellWindow.GtkVBox.BonoboDock.BonoboDockBand.BonoboDockItem*" style "murrine-evo-new-button-workaround"
+
+#class "GtkToolbar" style "murrine-toolbar"
+#class "GtkHandleBox" style "murrine-toolbar"
+
+
+###############################################################################
+# The following part of the gtkrc applies the different styles to the widgets.
+###############################################################################
+
+# Murrine default style is applied to every widget.
+class "GtkWidget" style "murrine-default"
+
+# Increase the x/ythickness in some widgets.
+class "GtkFrame" style "murrine-wide"
+class "GtkEntry" style "murrine-entry"
+class "MetaFrames" style "metacity-frame"
+class "GtkSeparator" style "murrine-wide"
+class "GtkWindow" style "metacity-frame"
+class "GtkCalendar" style "murrine-wide"
+
+class "GtkSpinButton" style "murrine-spinbutton"
+class "GtkScale" style "murrine-scale"
+class "GtkVScale" style "murrine-vscale"
+class "GtkHScale" style "murrine-hscale"
+class "GtkScrollbar" style "murrine-scrollbar"
+class "GtkVScrollbar" style "murrine-vscrollbar"
+class "GtkHScrollbar" style "murrine-hscrollbar"
+
+class "GtkRadio*" style "murrine-radiocheck"
+class "GtkCheck*" style "murrine-radiocheck"
+
+# General matching following, the order is choosen so that the right styles override each other eg. progressbar needs to be more important then the menu match.
+
+# This is not perfect, it could be done better (That is modify *every* widget in the notebook, and change those back that we really don't want changed)
+widget_class "*<GtkNotebook>*<GtkEventBox>" style "murrine-notebook-bg"
+widget_class "*<GtkNotebook>*<GtkDrawingArea>" style "murrine-notebook-bg"
+widget_class "*<GtkNotebook>*<GtkLayout>" style "murrine-notebook-bg"
+widget_class "*<GtkNotebook>*<GtkViewport>" style "murrine-notebook-bg"
+widget_class "*<GtkNotebook>*<GtkScrolledWindow>" style "murrine-notebook-bg"
+
+widget_class "*<GtkButton>" style "murrine-button"
+widget_class "*<GtkNotebook>" style "murrine-notebook"
+widget_class "*<GtkStatusbar>*" style "murrine-statusbar"
+
+widget_class "*<GtkComboBoxEntry>*" style "murrine-comboboxentry"
+widget_class "*<GtkCombo>*" style "murrine-comboboxentry"
+
+widget_class "*<GtkMenuBar>*" style "murrine-menubar"
+widget_class "*<GtkMenu>*" style "murrine-menu"
+widget_class "*<GtkMenuItem>*" style "murrine-menu-item"
+widget_class "*<GtkSeparatorMenuItem>*" style "murrine-separator-menu-item"
+
+widget_class "*.<GtkFrame>.<GtkLabel>" style "murrine-frame-title"
+widget_class "*.<GtkTreeView>*" style "murrine-treeview"
+
+widget_class "*<GtkProgress>" style "murrine-progressbar"
+widget_class "*<GtkProgressBar>" style "murrine-progressbar"
+
+# Treeview header
+widget_class "*.<GtkTreeView>.<GtkButton>" style "murrine-treeview-header"
+widget_class "*.<GtkCTree>.<GtkButton>" style "murrine-treeview-header"
+widget_class "*.<GtkList>.<GtkButton>" style "murrine-treeview-header"
+widget_class "*.<GtkCList>.<GtkButton>" style "murrine-treeview-header"
+
+# Workarounds for Evolution
+widget_class "*.ETable.ECanvas" style "murrine-treeview-header"
+widget_class "*.ETree.ECanvas" style "murrine-treeview-header"
+widget_class "*GtkCTree*" style "evolution-hack"
+widget_class "*GtkList*" style "evolution-hack"
+widget_class "*GtkCList*" style "evolution-hack"
+widget_class "*.ETree.*" style "evolution-hack"
+widget_class "*EInfoLabel*" style "evolution-hack"
+
+# The window of the tooltip is called "gtk-tooltip"
+################################
+# FIXME:
+# This will not work if one embeds eg. a button into the tooltip.
+# As far as I can tell right now we will need to rework the theme
+# quite a bit to get this working correctly.
+# (It will involve setting different priorities, etc.)
+################################
+widget "gtk-tooltip*" style "murrine-tooltips"
+
+###################################################
+# SPECIAL CASES AND WORKAROUNDS
+###################################################
+
+# Special case the nautilus-extra-view-widget
+# ToDo: A more generic approach for all applications that have a widget like this.
+widget "*.nautilus-extra-view-widget" style : highest "murrine-nautilus-location"
+
+# Work around for http://bugzilla.gnome.org/show_bug.cgi?id=382646
+# Note that the work around assumes that the combobox is _not_ in appears-as-list mode.
+# This style does not affect GtkComboBoxEntry, it does have an effect on comboboxes in appears-as-list mode though.
+style "murrine-text-is-fg-color-workaround"
+{
+ text[NORMAL] = @fg_color
+ text[PRELIGHT] = @fg_color
+ text[SELECTED] = @selected_fg_color
+ text[ACTIVE] = @fg_color
+ text[INSENSITIVE] = darker (@bg_color)
+}
+widget_class "*.<GtkComboBox>.<GtkCellView>" style "murrine-text-is-fg-color-workaround"
+
+style "murrine-menuitem-text-is-fg-color-workaround"
+{
+ text[NORMAL] = "#E6E6E6"
+ text[PRELIGHT] = @selected_fg_color
+ text[SELECTED] = @selected_fg_color
+ text[ACTIVE] = @fg_color
+ text[INSENSITIVE] = darker (@bg_color)
+}
+widget "*.gtk-combobox-popup-menu.*" style "murrine-menuitem-text-is-fg-color-workaround"
+
+# Work around the usage of GtkLabel inside GtkListItems to display text.
+# This breaks because the label is shown on a background that is based on the base color set.
+style "murrine-fg-is-text-color-workaround"
+{
+ fg[NORMAL] = @text_color
+ fg[PRELIGHT] = @text_color
+ fg[ACTIVE] = @selected_fg_color
+ fg[SELECTED] = @selected_fg_color
+ fg[INSENSITIVE] = darker (@bg_color)
+}
+widget_class "*<GtkListItem>*" style "murrine-fg-is-text-color-workaround"
+# The same problem also exists for GtkCList and GtkCTree.
+# Only match GtkCList and not the parent widgets, because that would also change the headers.
+widget_class "*<GtkCList>" style "murrine-fg-is-text-color-workaround"
+widget_class "*<EelEditableLabel>" style "murrine-fg-is-text-color-workaround"
+
+# The answer to the ultimate question of life, the universe, and everything is 42.
diff --git a/profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/panel.rc b/profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/panel.rc
new file mode 100644
index 0000000..f112772
--- /dev/null
+++ b/profiles/banshee/skeleton.glick/share/themes/Shiki-Brave/gtk-2.0/panel.rc
@@ -0,0 +1,63 @@
+################################################
+# PANELS
+################################################
+
+# Note: Uncommenting means to delete the "#" at the beginning of a line. Commenting out means to add a "#" at the beginning of a line. The "#" tells the theme wether to ignore the line or not.
+
+style "theme-panel"
+{
+ bg_pixmap[NORMAL] = "/Panels/panel-bg-dark.png" # Disable for normal panel backgrounds.
+
+ bg[SELECTED] = shade (0.85, @selected_bg_color) # Makes selected items dark.
+ bg[NORMAL] = "#3c3c3c" # Makes panel background dark.
+ bg[PRELIGHT] = shade (0.85, @selected_bg_color) # Makes panel button prelight dark.
+ bg[ACTIVE] = shade (0.60, @bg_color) # Makes active buttons dark.
+ bg[INSENSITIVE] = "#3C3C3C"
+ fg[NORMAL] = "#E6E6E6" # Makes panel text light.
+ fg[PRELIGHT] = @selected_fg_color # Makes prelighted text colored.
+ fg[SELECTED] = @selected_fg_color # Makes prelighted text colored.
+ fg[ACTIVE] = @selected_fg_color # Makes active text colored.
+ fg[INSENSITIVE] = "#666666" # Color for insensitive text.
+ text[NORMAL] = "#E6E6E6"
+ text[PRELIGHT] = @selected_fg_color # Makes prelighted text colored.
+ text[SELECTED] = @selected_fg_color # Makes prelighted text colored.
+ text[ACTIVE] = @selected_fg_color # Makes active text colored.
+ text[INSENSITIVE] = "#666666"
+
+ engine "murrine" {
+ roundness = 0 # This sets the roundness of panel items.
+ }
+}
+
+style "theme-panel-light"
+{
+ fg[NORMAL] = @fg_color
+}
+
+# Panel settings. Do not change.
+widget "*PanelWidget*" style "theme-panel"
+widget "*PanelApplet*" style "theme-panel"
+widget "*fast-user-switch*" style "theme-panel"
+widget "*gdm-user-switch*" style "theme-panel"
+widget "*CPUFreq*Applet*" style "theme-panel"
+widget "*indicator-applet*" style "theme-panel"
+class "PanelApp*" style "theme-panel"
+class "PanelToplevel*" style "theme-panel"
+widget_class "*PanelToplevel*" style "theme-panel"
+#widget_class "*Mail*" style "theme-panel" # Disabled to fix Evolution bug.
+#class "*Panel*" style "theme-panel" # Disabled to fix bug.
+widget_class "*notif*" style "theme-panel"
+widget_class "*Notif*" style "theme-panel"
+widget_class "*Tray*" style "theme-panel"
+widget_class "*tray*" style "theme-panel"
+widget_class "*computertemp*" style "theme-panel"
+widget_class "*Applet*Tomboy*" style "theme-panel"
+widget_class "*Applet*Netstatus*" style "theme-panel"
+
+# Fixes for tooltip text in some apps.
+widget_class "*Notif*Beagle*" style "theme-panel-light"
+widget_class "*Notif*Brasero*" style "theme-panel-light"
+
+# XFCE panel theming.
+widget "*Xfce*Panel*" style "theme-panel"
+class "*Xfce*Panel*" style "theme-panel"
diff --git a/profiles/banshee/skeleton.glick/start b/profiles/banshee/skeleton.glick/start
new file mode 100755
index 0000000..a2407f6
--- /dev/null
+++ b/profiles/banshee/skeleton.glick/start
@@ -0,0 +1,40 @@
+#!/usr/bin/env bash
+
+# This is the magic path used by glick
+BUNDLE_ROOT=/proc/self/fd/1023
+
+prefix=$BUNDLE_ROOT
+libdir=$BUNDLE_ROOT/lib
+exec_asm="Banshee.exe"
+MONO_EXE="$BUNDLE_ROOT/lib/banshee-1/$exec_asm"
+BANSHEE_EXEC_NAME=banshee
+
+# Don't touch the real config directory
+export XDG_CONFIG_HOME=$HOME/.config-glick
+BANSHEE_CONFIG_DIR="$XDG_CONFIG_HOME/banshee-1"
+
+export PATH=$BUNDLE_ROOT/bin${PATH:+:$PATH}
+export LD_LIBRARY_PATH=$BUNDLE_ROOT/lib/banshee-1:$BUNDLE_ROOT/lib/banshee-1/Extensions:$BUNDLE_ROOT/lib/banshee-1/Backends:$BUNDLE_ROOT/lib${LD_LIBRARY_PATH:+:$LD_LIBRARY_PATH}
+export GST_PLUGIN_PATH=$BUNDLE_ROOT/lib/banshee-1/gstreamer-0.10${GST_PLUGIN_PATH:+:$GST_PLUGIN_PATH}
+export GST_REGISTRY="$BANSHEE_CONFIG_DIR/gstreamer-registry.bin"
+
+GTK_THEME=Shiki-Brave
+export GTK2_RC_FILES=$BUNDLE_ROOT/share/themes/${GTK_THEME}/gtk-2.0/gtkrc
+
+[ -n "$BANSHEE_DEBUG" -o -f "${BANSHEE_CONFIG_DIR}/always-debug" ] && BANSHEE_DEBUG="--debug"
+BANSHEE_REDIRECT_LOG="${BANSHEE_CONFIG_DIR}/log"
+
+# We are testing the SGen compacting GC
+#export MONO_ENV_OPTIONS="--gc=sgen"
+
+if [ -n "$BANSHEE_DEBUG" -o -n "$BANSHEE_TRACE" -o -n "$BANSHEE_PROFILE" ]; then
+ MONO_OPTIONS="$BANSHEE_DEBUG $BANSHEE_TRACE $BANSHEE_PROFILE"
+ echo "** Running Mono with $MONO_OPTIONS **"
+fi
+
+# Finally - environment is set up, time to run our beloved
+exec_args="-a $BANSHEE_EXEC_NAME mono $MONO_OPTIONS $MONO_EXE $BANSHEE_DEBUG"
+
+mkdir -p `dirname "$BANSHEE_REDIRECT_LOG"`
+(echo "exec $exec_args " "$@"; echo; exec $exec_args "$@") &> $BANSHEE_REDIRECT_LOG
+
diff --git a/solitary/Entry.cs b/solitary/Entry.cs
index 2c2a6ea..989017b 100644
--- a/solitary/Entry.cs
+++ b/solitary/Entry.cs
@@ -84,6 +84,11 @@ public static class Entry
Console.WriteLine ("Done locating items. Total size is {0} KB.",
total_size / 1024);
+ Console.WriteLine ("Items out of confinement :");
+ foreach (KeyValuePair<string, int> item in solitary.EscapedItems) {
+ Console.WriteLine (String.Format (" {0} ({1})", item.Key, item.Value));
+ }
+
Console.WriteLine ("Creating bundle...");
solitary.CreateBundle (true);
Console.WriteLine ("Done.");
diff --git a/solitary/Item.cs b/solitary/Item.cs
index 66469c9..914cf13 100644
--- a/solitary/Item.cs
+++ b/solitary/Item.cs
@@ -34,6 +34,7 @@ public enum FileType
{
PE32Executable,
MachO,
+ ELF,
Data
}
@@ -67,8 +68,19 @@ public abstract class Item
public bool IsValidConfinementItem (Item item, bool checkExists)
{
+ if (!String.IsNullOrEmpty (ProcessTools.RealConfinementRoot) &&
+ item.File.FullName.StartsWith (ProcessTools.RealConfinementRoot)) {
+ string path = file.FullName.Replace (ProcessTools.RealConfinementRoot, Confinement.ConfinementRoot);
+ item.File = new FileInfo (path);
+ }
+
if (Confinement.ConfinementRoot != null &&
!item.File.FullName.StartsWith (Confinement.ConfinementRoot)) {
+ if (Confinement.EscapedItems.ContainsKey (item.File.FullName)) {
+ Confinement.EscapedItems[item.File.FullName]++;
+ } else {
+ Confinement.EscapedItems[item.File.FullName] = 1;
+ }
return false;
} else if (!checkExists) {
return true;
@@ -116,8 +128,14 @@ public abstract class Item
return null;
}
}
-
- if (SymlinkItem.IsSymlink (file.FullName)) {
+
+ if (!String.IsNullOrEmpty (ProcessTools.RealConfinementRoot) &&
+ file.FullName.StartsWith (ProcessTools.RealConfinementRoot)) {
+ string path = file.FullName.Replace (ProcessTools.RealConfinementRoot, confinement.ConfinementRoot);
+ file = new FileInfo (path);
+ }
+
+ if (SymlinkItem.IsSymlink (file.FullName)) {
return new SymlinkItem () {
File = file,
Confinement = confinement
@@ -129,6 +147,7 @@ public abstract class Item
item = new AssemblyItem ();
break;
case FileType.MachO:
+ case FileType.ELF:
item = new NativeLibraryItem ();
break;
default:
@@ -160,6 +179,8 @@ public abstract class Item
return FileType.MachO;
} else if (line.Contains ("PE32 executable")) {
return FileType.PE32Executable;
+ } else if (line.Contains ("ELF")) {
+ return FileType.ELF;
}
return FileType.Data;
diff --git a/solitary/NativeLibraryItem.cs b/solitary/NativeLibraryItem.cs
index 513dbf9..ca7bc94 100644
--- a/solitary/NativeLibraryItem.cs
+++ b/solitary/NativeLibraryItem.cs
@@ -67,7 +67,11 @@ public class NativeLibraryItem : Item
public void RelocateDependencies ()
{
if (ProcessTools.Host != ProcessHost.Darwin) {
- throw new ApplicationException ("Relocation not supported on anything but Darwin");
+ if (String.IsNullOrEmpty (ProcessTools.RealConfinementRoot)) {
+ throw new ApplicationException ("Relocation not supported on anything but Darwin");
+ } else {
+ return;
+ }
}
var proc = ProcessTools.CreateProcess ("otool", "-D " + File.FullName);
diff --git a/solitary/ProcessTools.cs b/solitary/ProcessTools.cs
index a7b2e23..7646d75 100644
--- a/solitary/ProcessTools.cs
+++ b/solitary/ProcessTools.cs
@@ -28,7 +28,9 @@ using System;
using System.IO;
using System.Diagnostics;
using System.Collections.Generic;
+using System.Text;
using System.Text.RegularExpressions;
+using Mono.Unix;
public enum ProcessHost
{
@@ -40,6 +42,7 @@ public enum ProcessHost
public static class ProcessTools
{
public static ProcessHost Host { get; private set; }
+ public static string RealConfinementRoot { get; private set; }
static ProcessTools ()
{
@@ -55,6 +58,15 @@ public static class ProcessTools
}
uname.Dispose ();
+
+ var glick_root = Environment.GetEnvironmentVariable ("GLICKROOT");
+ if (!String.IsNullOrEmpty (glick_root)) {
+ StringBuilder sb = new StringBuilder (200);
+ int r = Mono.Unix.Native.Syscall.readlink (glick_root, sb);
+ if (r > 0) {
+ RealConfinementRoot = sb.ToString (0, r);
+ }
+ }
}
public static Process CreateProcess (string cmd)
@@ -64,6 +76,13 @@ public static class ProcessTools
public static Process CreateProcess (string cmd, string args)
{
+ if (!String.IsNullOrEmpty (RealConfinementRoot)) {
+ // Process.Start closes all non-standard file descriptors, so we need
+ // to run the command with glick-shell, so that it has /proc/self/fd/1023
+ args = String.Format ("{0} {1} {2}", RealConfinementRoot, cmd, args);
+ cmd = "glick-shell";
+ }
+
try {
var proc = Process.Start (new ProcessStartInfo (cmd, args) {
RedirectStandardOutput = true,
@@ -75,13 +94,13 @@ public static class ProcessTools
if (proc.ExitCode != 0) {
return null;
}
-
+
return proc;
} catch {
return null;
}
}
-
+
public static List<string> GetNativeDependencies (FileInfo file)
{
var proc = Host == ProcessHost.Darwin
@@ -92,11 +111,15 @@ public static class ProcessTools
return null;
}
+ string pattern = Host == ProcessHost.Darwin
+ ? @"^\s+(.+)\(.+"
+ : @"=>\s(\S.+)\(.+";
+
var items = new List<string> ();
string line;
while ((line = proc.StandardOutput.ReadLine ()) != null) {
- var match = Regex.Match (line, @"^\s+(.+)\(.+");
+ var match = Regex.Match (line, pattern);
if (match.Success) {
items.Add (match.Groups[1].Value.Trim ());
}
diff --git a/solitary/Solitary.cs b/solitary/Solitary.cs
index c0de583..a5005ce 100644
--- a/solitary/Solitary.cs
+++ b/solitary/Solitary.cs
@@ -35,6 +35,7 @@ public class Solitary
public List<Regex> PathBlacklist { get; private set; }
public List<Item> Items { get; private set; }
public List<string> SearchPaths { get; private set; }
+ public Dictionary<string, int> EscapedItems { get; set; }
public string MonoPrefix { get; set; }
public string ConfinementRoot { get; set; }
public string OutputPath { get; set; }
@@ -50,6 +51,7 @@ public class Solitary
PathBlacklist = new List<Regex> ();
Items = new List<Item> ();
SearchPaths = new List<string> ();
+ EscapedItems = new Dictionary<string, int> ();
FindNativeLibrarySearchPaths ();
}