From 38e83e0bdc2e5baa26f3330e13fc134c5dc3bc83 Mon Sep 17 00:00:00 2001 From: brianl Date: Tue, 12 Dec 2006 21:52:11 +0000 Subject: [PATCH] Modifications for OS X git-svn-id: https://pysolfc.svn.sourceforge.net/svnroot/pysolfc/PySolFC/trunk@111 39dd0a4e-7c14-0410-91b3-c4f2d318f732 --- data/PySol.icns | Bin 0 -> 34137 bytes pysollib/app.py | 2 +- pysollib/games/__init__.py | 2 + pysollib/init.py | 9 ++- pysollib/macosx/__init__.py | 0 pysollib/macosx/appSupport.py | 25 ++++++++ pysollib/pysolaudio.py | 4 +- pysollib/resource.py | 1 + pysollib/tile/Tile.py | 4 +- pysollib/tile/menubar.py | 18 ++++-- pysollib/tile/soundoptionsdialog.py | 2 +- pysollib/tile/tkwrap.py | 14 ++++- pysollib/tk/menubar.py | 18 ++++-- pysollib/tk/tkwrap.py | 2 + setup_osx.py | 86 ++++++++++++++++++++++++++++ 15 files changed, 168 insertions(+), 19 deletions(-) create mode 100644 data/PySol.icns create mode 100644 pysollib/macosx/__init__.py create mode 100644 pysollib/macosx/appSupport.py create mode 100644 setup_osx.py diff --git a/data/PySol.icns b/data/PySol.icns new file mode 100644 index 0000000000000000000000000000000000000000..d80f947c6f0064cc250dd442bbdfc7264b56ad85 GIT binary patch literal 34137 zcmeHw2Ut``*YNFk3%kp*u(Vy4-n&u-DT2}!6_h5uNfi{)pzea$Kt)i|SP7;nsc&Lp zdNjonO*F=?0Zpv2CJG2F|JN#$^wA?SH

wqU!L)9Lp{ZRWl>;=j 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", self._keyPressHandler) m = "Ctrl-" - if os.name == "mac": m = "Cmd-" + if sys.platform == "darwin": m = "Cmd-" + + if self.top.tk.call("tk", "windowingsystem") == "aqua": + applemenu=MfxMenu(self.__menubar, n_("apple")) + applemenu.add_command(label=_("&About ")+PACKAGE, command=self.mHelpAbout) menu = MfxMenu(self.__menubar, n_("&File")) menu.add_command(label=n_("&New game"), command=self.mNewGame, accelerator="N") @@ -372,7 +377,8 @@ class PysolMenubar(PysolMenubarActions): menu.add_command(label=n_("Save &as..."), command=self.mSaveAs) menu.add_separator() menu.add_command(label=n_("&Hold and quit"), command=self.mHoldAndQuit) - menu.add_command(label=n_("&Quit"), command=self.mQuit, accelerator=m+"Q") + if not self.top.tk.call("tk", "windowingsystem") == "aqua": + menu.add_command(label=n_("&Quit"), command=self.mQuit, accelerator=m+"Q") if self.progress: self.progress.update(step=1) @@ -511,13 +517,15 @@ class PysolMenubar(PysolMenubarActions): menu.add_command(label=n_("&Rules for this game"), command=self.mHelpRules, accelerator="F1") menu.add_command(label=n_("&License terms"), command=self.mHelpLicense) ##menu.add_command(label=n_("What's &new ?"), command=self.mHelpNews) - menu.add_separator() - menu.add_command(label=n_("&About ")+PACKAGE+"...", command=self.mHelpAbout) + if not self.top.tk.call("tk", "windowingsystem") == "aqua": + menu.add_separator() + menu.add_command(label=n_("&About ")+PACKAGE+"...", command=self.mHelpAbout) MfxMenubar.addPath = None ### FIXME: all key bindings should be *added* to keyPressHandler ctrl = "Control-" + if sys.platform == "darwin": ctrl = "Command-" self._bindKey("", "n", self.mNewGame) self._bindKey("", "g", self.mSelectGameDialog) self._bindKey("", "v", self.mSelectGameDialogWithPreview) diff --git a/pysollib/tile/soundoptionsdialog.py b/pysollib/tile/soundoptionsdialog.py index 2d91ad46..1e6be712 100644 --- a/pysollib/tile/soundoptionsdialog.py +++ b/pysollib/tile/soundoptionsdialog.py @@ -142,7 +142,7 @@ class SoundOptionsDialog(MfxDialog): # remove "Apply" button kw.strings[1] = None # - frame = Tkinter.LabelFrame(top_frame, text=_('Enable samles')) + frame = Tkinter.LabelFrame(top_frame, text=_('Enable samples')) frame.pack(expand=1, fill='both', padx=5, pady=5) frame.columnconfigure(0, weight=1) frame.columnconfigure(1, weight=1) diff --git a/pysollib/tile/tkwrap.py b/pysollib/tile/tkwrap.py index 07216901..91de970b 100644 --- a/pysollib/tile/tkwrap.py +++ b/pysollib/tile/tkwrap.py @@ -48,6 +48,7 @@ from tkFont import Font # PySol imports from pysollib.mfxutil import destruct, Struct from pysollib.settings import PACKAGE, VERSION +from pysollib.macosx.appSupport import setupApp from tkutil import after_idle, init_tile, wm_set_icon from tkconst import EVENT_HANDLED, EVENT_PROPAGATE @@ -99,7 +100,7 @@ class MfxRoot(Tkinter.Tk): self.app = app def initToolkit(self, app, fg=None, bg=None, font=None): - theme = app.opt.tile_theme + setupApp(app) sw, sh, sd = self.winfo_screenwidth(), self.winfo_screenheight(), self.winfo_screendepth() self.wm_group(self) self.wm_title(PACKAGE + ' ' + VERSION) @@ -147,7 +148,16 @@ class MfxRoot(Tkinter.Tk): # theme try: - init_tile(app, self, theme) + windowingsystem = app.top.tk.call("tk", "windowingsystem") + if windowingsystem == "x11": + app.opt.tile_theme = "clam" + elif windowingsystem == "aqua": + app.opt.tile_theme = "aqua" + elif windowingsystem == "win32": + app.opt.tile_theme = "xpnative" + init_tile(app, self, app.opt.tile_theme) + except TclError: + raise except Exception, err: print >> sys.stderr, 'ERROR: set theme:', err ##self.option_add('*Toolbar.relief', 'groove') diff --git a/pysollib/tk/menubar.py b/pysollib/tk/menubar.py index 6cf09b58..1db3c075 100644 --- a/pysollib/tk/menubar.py +++ b/pysollib/tk/menubar.py @@ -37,7 +37,7 @@ __all__ = ['PysolMenubar'] # imports -import math, os, re +import math, os, sys, re import Tkinter, tkColorChooser, tkFileDialog # PySol imports @@ -213,6 +213,7 @@ class PysolMenubar(PysolMenubarActions): self.__menupath = {} self.__keybindings = {} self._createMenubar() + self.top = top if self.progress: self.progress.update(step=1) @@ -357,7 +358,11 @@ class PysolMenubar(PysolMenubarActions): bind(self.top, "", self._keyPressHandler) m = "Ctrl-" - if os.name == "mac": m = "Cmd-" + if sys.platform == "darwin": m = "Cmd-" + + if self.top.tk.call("tk", "windowingsystem") == "aqua": + applemenu=MfxMenu(self.__menubar, n_("apple")) + applemenu.add_command(label=_("&About ")+PACKAGE, command=self.mHelpAbout) menu = MfxMenu(self.__menubar, n_("&File")) menu.add_command(label=n_("&New game"), command=self.mNewGame, accelerator="N") @@ -379,7 +384,8 @@ class PysolMenubar(PysolMenubarActions): menu.add_command(label=n_("Save &as..."), command=self.mSaveAs) menu.add_separator() menu.add_command(label=n_("&Hold and quit"), command=self.mHoldAndQuit) - menu.add_command(label=n_("&Quit"), command=self.mQuit, accelerator=m+"Q") + if not self.top.tk.call("tk", "windowingsystem") == "aqua": + menu.add_command(label=n_("&Quit"), command=self.mQuit, accelerator=m+"Q") if self.progress: self.progress.update(step=1) @@ -516,13 +522,15 @@ class PysolMenubar(PysolMenubarActions): menu.add_command(label=n_("&Rules for this game"), command=self.mHelpRules, accelerator="F1") menu.add_command(label=n_("&License terms"), command=self.mHelpLicense) ##menu.add_command(label=n_("What's &new ?"), command=self.mHelpNews) - menu.add_separator() - menu.add_command(label=n_("&About ")+PACKAGE+"...", command=self.mHelpAbout) + if not self.top.tk.call("tk", "windowingsystem") == "aqua": + menu.add_separator() + menu.add_command(label=n_("&About ")+PACKAGE+"...", command=self.mHelpAbout) MfxMenubar.addPath = None ### FIXME: all key bindings should be *added* to keyPressHandler ctrl = "Control-" + if sys.platform == "darwin": ctrl = "Command-" self._bindKey("", "n", self.mNewGame) self._bindKey("", "g", self.mSelectGameDialog) self._bindKey("", "v", self.mSelectGameDialogWithPreview) diff --git a/pysollib/tk/tkwrap.py b/pysollib/tk/tkwrap.py index 10b7c4ef..86e1a609 100644 --- a/pysollib/tk/tkwrap.py +++ b/pysollib/tk/tkwrap.py @@ -48,6 +48,7 @@ from tkFont import Font # PySol imports from pysollib.mfxutil import destruct, Struct from pysollib.settings import PACKAGE, VERSION +from pysollib.macosx.appSupport import setupApp from tkutil import after_idle, wm_set_icon from tkconst import EVENT_HANDLED, EVENT_PROPAGATE @@ -99,6 +100,7 @@ class MfxRoot(Tkinter.Tk): self.app = app def initToolkit(self, app, fg=None, bg=None, font=None, theme=None): + setupApp(app) sw, sh, sd = self.winfo_screenwidth(), self.winfo_screenheight(), self.winfo_screendepth() self.wm_group(self) self.wm_title(PACKAGE + ' ' + VERSION) diff --git a/setup_osx.py b/setup_osx.py new file mode 100644 index 00000000..145a2852 --- /dev/null +++ b/setup_osx.py @@ -0,0 +1,86 @@ +""" +Usage: + python setup.py py2app +""" + +import os, sys +from subprocess import call +from setuptools import setup +from pysollib.settings import PACKAGE, VERSION, FC_VERSION + +# Use Tile widgets, if they are installed. +# http://tktable.sourceforge.net/tile/ +import Tkinter +root = Tkinter.Tk() +root.withdraw() +try: + root.tk.call('package', 'require', 'tile', '0.7.8') +except: + TILE = None +else: + TILE = "tile0.7.8" + TCL_EXTENSION_PATH = "/Library/Tcl" +finally: + root.destroy() + del root, Tkinter + +# Use Freecell Solver, if it is installed. +# http://fc-solve.berlios.de/ +SOLVER_LIB_PATH = "/usr/local/lib/libfreecell-solver.0.dylib" +SOLVER = "/usr/local/bin/fc-solve" +if not os.path.exists(SOLVER_LIB_PATH): + SOLVER_LIB_PATH = SOLVER = "" + +GETINFO_STRING = "PySol Fan Club Edition \ + %s %s, (C) 1998-2003 Markus F.X.J Oberhumer \ + %s, (C) 2006 Skomoroh" % (PACKAGE, VERSION, FC_VERSION) +PLIST = dict( + CFBundleDevelopmentRegion = 'en_US', + CFBundleExecutable = PACKAGE, + CFBundleDisplayName = PACKAGE, + CFBundleGetInfoString = GETINFO_STRING, + CFBundleIdentifier = 'org.pysol.PySol', + CFBundleName = PACKAGE, + CFBundleVersion = '%s (%s)' % (VERSION, FC_VERSION), + CFBundleShortVersionString = '%s' % VERSION, + NSHumanReadableCopyright = "Copyright (C) 1998-2003 Markus F.X.J. Oberhumer", + ) +APP = ['pysol.py'] +ICON_FILE = 'data/PySol.icns' +DATA_FILES = ['docs', 'data', 'scripts','COPYING', 'README', SOLVER] +RESOURCES = [os.path.join(TCL_EXTENSION_PATH, TILE)] if TILE else [] +FRAMEWORKS = [SOLVER_LIB_PATH] +OPTIONS = dict(argv_emulation=True, + plist=PLIST, + iconfile=ICON_FILE, + resources=RESOURCES, + frameworks=FRAMEWORKS, + excludes=['pysollib.pysolgtk'] + ) + +setup( + app=APP, + data_files=DATA_FILES, + options={'py2app': OPTIONS}, + setup_requires=['py2app'], + ) + +## +top = os.getcwd() +# FIXME: a hack to get Tcl extensions working +# from inside the app bundle +if TILE and "py2app" in sys.argv: + os.chdir('dist/%s.app/Contents/Frameworks' % PACKAGE) + try: + os.symlink('../Resources/%s' % TILE, TILE) + except OSError: + pass + os.chdir(top) +# Modify the fc-solve binary with install_name_tool to use the dependent +# libfreecell-solver dynamic library in the app bundle. +if SOLVER and "py2app" in sys.argv: + os.chdir('dist/%s.app/Contents/Resources' % PACKAGE) + call("install_name_tool -change \ + /usr/local/lib/libfreecell-solver.0.dylib \ + @executable_path/../Frameworks/libfreecell-solver.0.dylib fc-solve", + shell=True) \ No newline at end of file