diff options
-rw-r--r-- | osx/Info.plist.in (renamed from Info.plist.in) | 0 | ||||
-rw-r--r-- | osx/Patchage.icns (renamed from icons/Patchage.icns) | bin | 177383 -> 177383 bytes | |||
-rwxr-xr-x | osx/bundleify.sh | 33 | ||||
-rw-r--r-- | osx/gtkrc | 426 | ||||
-rw-r--r-- | osx/pango.modules | 2 | ||||
-rw-r--r-- | osx/pangorc | 2 | ||||
-rw-r--r-- | src/main.cpp | 38 | ||||
-rw-r--r-- | wscript | 10 |
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 Binary files differindex 83364a2..83364a2 100644 --- a/icons/Patchage.icns +++ b/osx/Patchage.icns 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; @@ -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 |