summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--osx/Info.plist.in (renamed from Info.plist.in)0
-rw-r--r--osx/Patchage.icns (renamed from icons/Patchage.icns)bin177383 -> 177383 bytes
-rwxr-xr-xosx/bundleify.sh33
-rw-r--r--osx/gtkrc426
-rw-r--r--osx/pango.modules2
-rw-r--r--osx/pangorc2
-rw-r--r--src/main.cpp38
-rw-r--r--wscript10
8 files changed, 508 insertions, 3 deletions
diff --git a/Info.plist.in b/osx/Info.plist.in
index 69f8fee..69f8fee 100644
--- a/Info.plist.in
+++ b/osx/Info.plist.in
diff --git a/icons/Patchage.icns b/osx/Patchage.icns
index 83364a2..83364a2 100644
--- a/icons/Patchage.icns
+++ b/osx/Patchage.icns
Binary files differ
diff --git a/osx/bundleify.sh b/osx/bundleify.sh
new file mode 100755
index 0000000..caf4a26
--- /dev/null
+++ b/osx/bundleify.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+bundle=$1
+exe=$2
+
+libs="`otool -L $exe | grep '\.dylib\|\.so' | grep '/User\|/opt/local' | sed 's/(.*//'`"
+
+mkdir "$bundle/Contents/lib"
+for l in $libs; do
+ cp $l $bundle/Contents/lib
+done
+
+mkdir "$bundle/Contents/lib/engines"
+cp /opt/local/lib/gtk-2.0/2.10.0/engines/libclearlooks.so $bundle/Contents/lib/engines
+
+mkdir "$bundle/Contents/lib/modules"
+cp /opt/local/lib/pango/1.6.0/modules/*basic*.so $bundle/Contents/lib/modules
+
+reclibs="`otool -L $bundle/Contents/lib/engines/* $bundle/Contents/lib/modules/* | grep '\.dylib\|\.so' | grep '/User\|/opt/local' | sed 's/(.*//'`"
+
+for l in $libs $reclibs; do
+ lname=`echo $l | sed 's/.*\///'`
+ lid="@executable_path/lib/$lname"
+ lpath="$bundle/Contents/lib/$lname"
+ install_name_tool -id $lid $lpath
+ install_name_tool -change $l $lid $exe
+ for j in `find $bundle -name '*.so' -or -name '*.dylib'`; do
+ install_name_tool -change $l $lid $j
+ done;
+done
+
+echo "External library references:"
+otool -L $exe `find $bundle -name '*.so' -or -name '*.dylib'` | grep -v ':' | grep -v '@executable_path' | sort | uniq
diff --git a/osx/gtkrc b/osx/gtkrc
new file mode 100644
index 0000000..6df11b2
--- /dev/null
+++ b/osx/gtkrc
@@ -0,0 +1,426 @@
+
+# Please keep this gtkrc in sync with the other ones from Clearlooks based themes.
+
+gtk-color-scheme = "base_color:#ffffff\nfg_color:#000000\ntooltip_fg_color:#000000\nselected_bg_color:#86ABD9\nselected_fg_color:#ffffff\ntext_color:#1A1A1A\nbg_color:#EDECEB\ntooltip_bg_color:#F5F5B5"
+
+style "default" {
+ xthickness = 1
+ ythickness = 1
+
+ #######################
+ # Style Properties
+ #######################
+ GtkButton::child-displacement-x = 1
+ GtkButton::child-displacement-y = 1
+ GtkButton::default-border = { 0, 0, 0, 0 }
+ GtkButton::image-spacing = 4
+ GtkToolButton::icon-spacing = 4
+
+ GtkCheckButton::indicator-size = 14
+
+ GtkPaned::handle-size = 6
+
+ GtkRange::trough-border = 0
+ GtkRange::slider-width = 15
+ GtkRange::stepper-size = 15
+
+ GtkScale::slider-length = 23
+ GtkScale::trough-side-details = 1
+
+ GtkScrollbar::min-slider-length = 30
+ GtkMenuBar::internal-padding = 0
+ GtkExpander::expander-size = 16
+ GtkToolbar::internal-padding = 1
+ GtkTreeView::expander-size = 14
+ GtkTreeView::vertical-separator = 0
+
+ GtkMenu::horizontal-padding = 0
+ GtkMenu::vertical-padding = 0
+
+ WnckTasklist::fade-overlay-rect = 0
+ # The following line hints to gecko (and possibly other appliations)
+ # that the entry should be drawn transparently on the canvas.
+ # Without this, gecko will fill in the background of the entry.
+ GtkEntry::honors-transparent-bg-hint = 1
+
+ GtkEntry::progress-border = { 2, 2, 2, 2 }
+
+ ####################
+ # Color Definitions
+ ####################
+ bg[NORMAL] = @bg_color
+ bg[PRELIGHT] = shade (1.02, @bg_color)
+ bg[SELECTED] = @selected_bg_color
+ bg[INSENSITIVE] = @bg_color
+ bg[ACTIVE] = shade (0.9, @bg_color)
+
+ fg[NORMAL] = @fg_color
+ fg[PRELIGHT] = @fg_color
+ fg[SELECTED] = @selected_fg_color
+ fg[INSENSITIVE] = darker (@bg_color)
+ fg[ACTIVE] = @fg_color
+
+ text[NORMAL] = @text_color
+ text[PRELIGHT] = @text_color
+ text[SELECTED] = @selected_fg_color
+ text[INSENSITIVE] = darker (@bg_color)
+ text[ACTIVE] = @selected_fg_color
+
+ base[NORMAL] = @base_color
+ base[PRELIGHT] = shade (0.95, @bg_color)
+ base[SELECTED] = @selected_bg_color
+ base[INSENSITIVE] = @bg_color
+ base[ACTIVE] = shade (0.9, @selected_bg_color)
+
+ engine "clearlooks" {
+ colorize_scrollbar = TRUE
+ reliefstyle = 1
+ menubarstyle = 2
+ toolbarstyle = 1
+ animation = FALSE
+ radius = 3.0
+ style = GUMMY
+
+ # Set a hint to disable backward compatibility fallbacks.
+ hint = "use-hints"
+ }
+}
+
+style "wide" {
+ xthickness = 2
+ ythickness = 2
+}
+
+style "wider" {
+ xthickness = 3
+ ythickness = 3
+}
+
+style "entry" {
+ xthickness = 3
+ ythickness = 3
+
+ bg[SELECTED] = mix (0.4, @selected_bg_color, @base_color)
+ fg[SELECTED] = @text_color
+
+ engine "clearlooks" {
+ focus_color = shade (0.65, @selected_bg_color)
+ }
+}
+
+style "spinbutton" {
+
+ engine "clearlooks" {
+ hint = "spinbutton"
+ }
+}
+
+style "scale" {
+ xthickness = 2
+ ythickness = 2
+
+ engine "clearlooks" {
+ hint = "scale"
+ }
+}
+
+style "vscale" {
+
+ engine "clearlooks" {
+ hint = "vscale"
+ }
+}
+
+style "hscale" {
+
+ engine "clearlooks" {
+ hint = "hscale"
+ }
+}
+
+style "scrollbar" {
+ xthickness = 2
+ ythickness = 2
+
+ engine "clearlooks" {
+ hint = "scrollbar"
+ }
+}
+
+style "hscrollbar" {
+
+ engine "clearlooks" {
+ hint = "hscrollbar"
+ }
+}
+
+style "vscrollbar" {
+
+ engine "clearlooks" {
+ hint = "vscrollbar"
+ }
+}
+
+style "notebook_bg" {
+
+ bg[NORMAL] = shade (1.02, @bg_color)
+}
+
+style "button" {
+ xthickness = 3
+ ythickness = 3
+
+ bg[NORMAL] = shade (1.04, @bg_color)
+ bg[PRELIGHT] = shade (1.06, @bg_color)
+ bg[ACTIVE] = shade (0.85, @bg_color)
+}
+
+# The color is changed by the notebook_bg style, this style
+# changes the x/ythickness
+style "notebook" {
+ xthickness = 3
+ ythickness = 3
+}
+
+style "statusbar" {
+
+ engine "clearlooks" {
+ hint = "statusbar"
+ }
+}
+
+style "comboboxentry" {
+
+ engine "clearlooks" {
+ # Note:
+ # If you set the appears-as-list option on comboboxes in the theme,
+ # then you should set this hint on the combobox instead.
+ hint = "comboboxentry"
+ }
+}
+
+style "menubar" {
+
+ engine "clearlooks" {
+ hint = "menubar"
+ }
+}
+
+style "menu" {
+ xthickness = 0
+ ythickness = 0
+
+ bg[NORMAL] = shade (1.08, @bg_color)
+
+ engine "clearlooks" {
+ radius = 0.0
+ }
+}
+
+style "menu_item" {
+ xthickness = 2
+ ythickness = 3
+
+ fg[PRELIGHT] = @selected_fg_color
+}
+
+# This style is there to modify the separator menu items. The goals are:
+# 1. Get a specific height.
+# 2. The line should go to the edges (ie. no border at the left/right)
+style "separator_menu_item" {
+ xthickness = 1
+ ythickness = 0
+
+ GtkSeparatorMenuItem::horizontal-padding = 0
+ GtkWidget::wide-separators = 1
+ GtkWidget::separator-width = 1
+ GtkWidget::separator-height = 7
+}
+
+style "frame_title" {
+
+ fg[NORMAL] = lighter (@fg_color)
+}
+
+style "treeview" {
+
+ engine "clearlooks" {
+ hint = "treeview"
+ }
+}
+
+# The almost useless progress bar style
+style "progressbar" {
+ xthickness = 1
+ ythickness = 1
+
+ fg[PRELIGHT] = @selected_fg_color
+
+ engine "clearlooks" {
+ # Explicitly set the radius for the progress bars inside menu items.
+ radius = 3.0
+
+ hint = "progressbar"
+ }
+}
+
+# This style is based on the default style, so that the colors from the button
+# style are overriden again.
+style "treeview_header" = "default" {
+ xthickness = 2
+ ythickness = 1
+
+ engine "clearlooks" {
+ hint = "treeview-header"
+ }
+}
+
+style "tooltips" {
+ xthickness = 4
+ ythickness = 4
+
+ bg[NORMAL] = @tooltip_bg_color
+ fg[NORMAL] = @tooltip_fg_color
+}
+
+style "nautilus_location" {
+
+ bg[NORMAL] = mix (0.60, shade (1.05, @bg_color), @selected_bg_color)
+}
+
+# Wrokaroudn style for places where the text color is used instead of the fg color.
+style "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)
+}
+
+# Workaround style for menus where the text color is used instead of the fg color.
+style "menuitem_text_is_fg_color_workaround" {
+
+ text[NORMAL] = @fg_color
+ text[PRELIGHT] = @selected_fg_color
+ text[SELECTED] = @selected_fg_color
+ text[ACTIVE] = @fg_color
+ text[INSENSITIVE] = darker (@bg_color)
+}
+
+# Workaround style for places where the fg color is used instead of the text color.
+style "fg_is_text_color_workaround" {
+
+ fg[NORMAL] = @text_color
+ fg[PRELIGHT] = @text_color
+ fg[SELECTED] = @selected_fg_color
+ fg[ACTIVE] = @selected_fg_color
+ fg[INSENSITIVE] = darker (@bg_color)
+}
+
+# Style to set the toolbar to use a flat style. This is because the "New" button in
+# Evolution is not drawn transparent. So if there is a gradient in the background it will
+# look really wrong.
+# See http://bugzilla.gnome.org/show_bug.cgi?id=446953.
+style "evo_new_button_workaround" {
+
+ engine "clearlooks" {
+ toolbarstyle = 0
+ }
+}
+
+
+###############################################################################
+# The following part of the gtkrc applies the different styles to the widgets.
+###############################################################################
+
+# The default style is applied to every widget
+class "GtkWidget" style "default"
+
+class "GtkSeparator" style "wide"
+class "GtkFrame" style "wide"
+class "GtkCalendar" style "wide"
+class "GtkEntry" style "entry"
+
+class "GtkSpinButton" style "spinbutton"
+class "GtkScale" style "scale"
+class "GtkVScale" style "vscale"
+class "GtkHScale" style "hscale"
+class "GtkScrollbar" style "scrollbar"
+class "GtkHScrollbar" style "hscrollbar"
+class "GtkVScrollbar" style "vscrollbar"
+
+# General matching follows. The order is choosen so that the right styles override
+# each other. EG. progressbar needs to be more important than the menu match.
+widget_class "*<GtkNotebook>" style "notebook_bg"
+# 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 "notebook_bg"
+widget_class "*<GtkNotebook>*<GtkDrawingArea>" style "notebook_bg"
+widget_class "*<GtkNotebook>*<GtkLayout>" style "notebook_bg"
+widget_class "*<GtkNotebook>*<GtkViewport>" style "notebook_bg"
+widget_class "*<GtkNotebook>*<GtkScrolledWindow>" style "notebook_bg"
+
+widget_class "*<GtkButton>" style "button"
+widget_class "*<GtkNotebook>" style "notebook"
+widget_class "*<GtkStatusbar>*" style "statusbar"
+
+widget_class "*<GtkComboBoxEntry>*" style "comboboxentry"
+widget_class "*<GtkCombo>*" style "comboboxentry"
+
+widget_class "*<GtkMenuBar>*" style "menubar"
+widget_class "*<GtkMenu>*" style "menu"
+widget_class "*<GtkMenuItem>*" style "menu_item"
+widget_class "*<GtkSeparatorMenuItem>*" style "separator_menu_item"
+
+widget_class "*.<GtkFrame>.<GtkLabel>" style "frame_title"
+widget_class "*.<GtkTreeView>*" style "treeview"
+
+widget_class "*<GtkProgress>" style "progressbar"
+
+# Treeview headers (and similar stock GTK+ widgets)
+widget_class "*.<GtkTreeView>.<GtkButton>" style "treeview_header"
+widget_class "*.<GtkCTree>.<GtkButton>" style "treeview_header"
+widget_class "*.<GtkList>.<GtkButton>" style "treeview_header"
+widget_class "*.<GtkCList>.<GtkButton>" style "treeview_header"
+
+# 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 "tooltips"
+
+##########################################################################
+# Following are special cases and workarounds for issues in applications.
+##########################################################################
+
+# Workaround for the evolution ETable (bug #527532)
+widget_class "*.<ETable>.<ECanvas>" style "treeview_header"
+# Workaround for the evolution ETree
+widget_class "*.<ETree>.<ECanvas>" style "treeview_header"
+
+# 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 "nautilus_location"
+
+# Work around for http://bugzilla.gnome.org/show_bug.cgi?id=382646
+# Note that this work around assumes that the combobox is _not_ in appears-as-list mode.
+widget_class "*.<GtkComboBox>.<GtkCellView>" style "text_is_fg_color_workaround"
+# This is the part of the workaround that fixes the menus
+widget "*.gtk-combobox-popup-menu.*" style "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.
+widget_class "*<GtkListItem>*" style "fg_is_text_color_workaround"
+# GtkCList also uses the fg color to draw text on top of the base colors.
+widget_class "*<GtkCList>" style "fg_is_text_color_workaround"
+# Nautilus when renaming files, and maybe other places.
+widget_class "*<EelEditableLabel>" style "fg_is_text_color_workaround"
+
+# See the documentation of the style.
+widget_class "EShellWindow.GtkVBox.BonoboDock.BonoboDockBand.BonoboDockItem*" style "evo_new_button_workaround"
diff --git a/osx/pango.modules b/osx/pango.modules
new file mode 100644
index 0000000..108291e
--- /dev/null
+++ b/osx/pango.modules
@@ -0,0 +1,2 @@
+lib/modules/pango-basic-atsui.so BasicScriptEngineATSUI PangoEngineShape PangoRenderATSUI common:
+lib/modules/pango-basic-fc.so BasicScriptEngineFc PangoEngineShape PangoRenderFc latin:* cyrillic:* greek:* armenian:* georgian:* runic:* ogham:* bopomofo:* cherokee:* coptic:* deseret:* ethiopic:* gothic:* han:* hiragana:* katakana:* old-italic:* canadian-aboriginal:* yi:* braille:* cypriot:* limbu:* osmanya:* shavian:* linear-b:* ugaritic:* glagolitic:* cuneiform:* phoenician:* common:
diff --git a/osx/pangorc b/osx/pangorc
new file mode 100644
index 0000000..ce582e3
--- /dev/null
+++ b/osx/pangorc
@@ -0,0 +1,2 @@
+[Pango]
+ModuleFiles = ./Resources/pango.modules
diff --git a/src/main.cpp b/src/main.cpp
index 7c90ea5..a691210 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -15,6 +15,16 @@
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
+#ifdef __APPLE__
+#include <stdlib.h>
+#include <unistd.h>
+#include <string>
+#include <gtk/gtk.h>
+#include "binary_location.h"
+#endif
+
+#include <iostream>
+
#include <libgnomecanvasmm.h>
#include <glibmm/exception.h>
@@ -22,9 +32,35 @@
#include "Patchage.hpp"
+#ifdef __APPLE__
+void
+set_bundle_environment()
+{
+ char* binloc_c = binary_location();
+ std::string binloc(binloc_c);
+ free(binloc_c);
+
+ const std::string bundle_path = binloc.substr(0, binloc.find_last_of('/'));
+
+ const std::string gtk_path(bundle_path + "/lib");
+ setenv("GTK_PATH", gtk_path.c_str(), 1);
+ std::cout << "GTK PATH " << gtk_path << std::endl;
+
+ chdir(bundle_path.c_str());
+ const std::string pangorc_path(bundle_path + "/Resources/pangorc");
+ setenv("PANGO_RC_FILE", pangorc_path.c_str(), 1);
+
+ gtk_rc_parse((bundle_path + "/Resources/gtkrc").c_str());
+}
+#endif
+
int
main(int argc, char** argv)
{
+#ifdef __APPLE__
+ set_bundle_environment();
+#endif
+
try {
Glib::thread_init();
@@ -34,7 +70,7 @@ main(int argc, char** argv)
Patchage patchage(argc, argv);
app.run(*patchage.window());
-
+
} catch (std::exception& e) {
Raul::error << "patchage: error: " << e.what() << std::endl;
return 1;
diff --git a/wscript b/wscript
index dcfa6ee..59ed32d 100644
--- a/wscript
+++ b/wscript
@@ -173,16 +173,22 @@ def build(bld):
if Options.platform == 'darwin':
# Property list
bld(features = 'subst',
- source = 'Info.plist.in',
+ source = 'osx/Info.plist.in',
target = out_base + 'Info.plist',
install_path = '',
chmod = 0644)
# Icons
bld(rule='cp ${SRC} ${TGT}',
- source = 'icons/Patchage.icns',
+ source = 'osx/Patchage.icns',
target = out_base + 'Resources/Patchage.icns')
+ # Gtk/Pango/etc configuration files
+ for i in ['pangorc', 'pango.modules', 'gtkrc']:
+ bld(rule = 'cp ${SRC} ${TGT}',
+ source = 'osx/' + i,
+ target = out_base + 'Resources/' + i)
+
# Icons
# After installation, icon cache should be updated using:
# gtk-update-icon-cache -f -t $(datadir)/icons/hicolor