Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
94125ff
Use shift key for direct access to search tabs (#35)
joeraz Jun 21, 2026
5e38a60
Improved Aces Up card count check.
joeraz Jun 21, 2026
91e8d50
Bump actions/checkout from 6 to 7 in /.github/workflows (#575)
dependabot[bot] Jun 23, 2026
f267eec
Add links for game types to Demons and Thieves/Antares game rule files
joeraz Jun 23, 2026
64ff0d8
Disable card background option if there is only one back for the cardset
joeraz Jun 24, 2026
b828920
New locale logic that should address localization changes in installe…
joeraz Jun 24, 2026
f33dc33
Fix for Flamboyant and similar games handling of multiple cards flipp…
joeraz Jun 27, 2026
d5d24ea
Extend natural sort logic to cardset and tile selection
joeraz Jun 29, 2026
719bfc3
Cleanup resource.py and resolved FIXMEs
joeraz Jun 30, 2026
04316d6
use the same seconds per frame with kivy as tk (#577)
canu1337 Jul 1, 2026
dd1afd5
Completely rewrite install.html to give accurate, up-to-date installa…
joeraz Jul 3, 2026
948a41c
Use splitlist instead of split (see #576)
joeraz Jul 3, 2026
8c96352
Use natural sort in Kivy menus
joeraz Jul 3, 2026
5f3d561
Include size category in cardset info window
joeraz Jul 6, 2026
5b34d6b
Add check to ensure moves can't be made until the current moves/anima…
joeraz Jul 9, 2026
d252733
Address stuck checker regression
joeraz Jul 14, 2026
75bfb6f
Slightly enlarge cardset info window due to text wrap cutoff
joeraz Jul 15, 2026
2ad8c19
Give cardset-size Medium its own gettext context (#579)
bwrightkc Jul 16, 2026
bb269e9
Fix macOS package build to produce a true universal2 app (#580)
bwrightkc Jul 16, 2026
4f03762
Block card input while paused on Android/Kivy (#583)
bwrightkc Jul 17, 2026
327ad87
3.6.1 release
joeraz Jul 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ jobs:
python-version: 3.7

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@v7
- name: Set up Python
uses: actions/setup-python@v6
with:
Expand Down
27 changes: 21 additions & 6 deletions .github/workflows/macos-package.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@ on:

jobs:
build:
runs-on: macos-14
runs-on: macos-15

steps:
- uses: actions/checkout@v6
- name: Set up python
- uses: actions/checkout@v7
- name: "Set up python (universal2: arm64 + x86_64)"
env:
PYVER: '3.9.7'
PYVER_SHORT: '3.9'
PYVER: '3.11.9'
PYVER_SHORT: '3.11'
run: |
wget -O python.pkg "https://www.python.org/ftp/python/${PYVER}/python-${PYVER}-macosx10.9.pkg"
wget -O python.pkg "https://www.python.org/ftp/python/${PYVER}/python-${PYVER}-macos11.pkg"
sudo installer -pkg python.pkg -target /
echo "/Library/Frameworks/Python.framework/Versions/${PYVER_SHORT}/bin" >> $GITHUB_PATH
- name: Install dependencies
Expand Down Expand Up @@ -67,6 +67,21 @@ jobs:
PYTHONPATH="." python3 setup_osx.py py2app
test -d dist/PySolFC.app
zip -q -r -X PySolFC-app.zip dist
- name: Verify the app is universal2 (arm64 + x86_64)
run: |
set -euo pipefail
check_universal2() {
archs="$(lipo -archs "$1" 2>/dev/null || true)"
case "$archs" in
*arm64*x86_64*|*x86_64*arm64*) ;;
*) echo "ERROR: $1 is not universal2 (archs: ${archs:-none})"; exit 1 ;;
esac
}
check_universal2 "dist/PySolFC.app/Contents/MacOS/PySolFC"
pygame_ext=$(find dist/PySolFC.app -name 'base.cpython-*-darwin.so' -path '*/pygame/*' | head -1)
test -n "$pygame_ext"
check_universal2 "$pygame_ext"
echo "OK: app and pygame-ce are both universal2."
- name: Make the .dmg for easy installation
run:
create-dmg --volname "Install PySolFC"
Expand Down
2 changes: 1 addition & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ rules:

pot:
./scripts/all_games.py gettext > po/games.pot
xgettext --keyword=n_ --add-comments=TRANSLATORS: -o po/pysol.pot \
xgettext --keyword=n_ --keyword=pgettext:1c,2 --add-comments=TRANSLATORS: -o po/pysol.pot \
pysollib/*.py pysollib/*/*.py pysollib/*/*/*.py data/pysolfc.glade
set -e; \
for lng in de fr pl it ru pt_BR; do \
Expand Down
5 changes: 5 additions & 0 deletions NEWS.asciidoc
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
[[news]]
=== News
* _19 July, 2026:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-3.6.1/[PySolFC
v3.6.1]. New in this release:
** Improved Python 3.14 support.
** Many bugfixes.
* _13 June, 2026:_ There is a new stable release
https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-3.6.0/[PySolFC
v3.6.0]. New in this release:
Expand Down
2 changes: 2 additions & 0 deletions html-src/howtoplay.html
Original file line number Diff line number Diff line change
Expand Up @@ -106,4 +106,6 @@ <h2>Undocumented key bindings</h2>
<li> <i>Ctrl-U</i> - Play the next music song
<li> <i>Ctrl-W</i> - Select game, using old game select window
<li> <i>F5</i> - Refresh the game layout
<li> <i>Shift-Ctrl-V</i> - Select game, using search tab
<li> <i>Shift-Ctrl-E</i> - Select cardset, using search tab
</ul>
2 changes: 1 addition & 1 deletion html-src/index.html
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<h1>PySol - a Solitaire Game Collection</h1>
<ul>
<li> <a href="intro.html">Introduction</a>
<!-- <p> <a href="install.html">Installation</a>-->
<li> <a href="install.html">Installation</a>
<li> <a href="howtoplay.html">How to use PySol</a>
<li> <a href="accessibility.html">Accessibility</a>
</ul>
Expand Down
80 changes: 47 additions & 33 deletions html-src/install.html
Original file line number Diff line number Diff line change
@@ -1,47 +1,61 @@
<h1>Installation</h1>
<p>
There is no need to compile anything since the whole program is just
a Python script. Just run it, and that's all.
<p>
PySol requires Python 2.3 and Tcl/Tk 8.4 or better. Both packages are
freely available for Unix, Windows and Macintosh platforms.
<p>
PySol is free <i>Open Source</i> software distributed under the terms of the
<a href="license.html">GNU GPL</a>.

PySolFC is free and open source software, released under the <a href="license.html">GNU GPL</a>. It will run on Windows, Mac, Linux, Android, etc. The easiest way to run is to use a self-contained installer, which is available for most supported operating systems.

<h2>Windows 95/98/ME/NT/2000</h2>

PySol now ships as a completely self-contained setup file, so there's
no need to install anything else.
<h2>Windows</h2>
<p>
If you want to modify the PySol source code or write your own
Python programs you can get the development system from
<a href="http://www.python.org/download/download_windows.html">http://www.python.org/download/download_windows.html</a>
You can download the latest Windows installer from <a href="https://sourceforge.net/projects/pysolfc/files/PySolFC/">SourceForge</a>. The installer includes the app, Python and all of the requirements to run PySolFC. A basic and a full installer are available - the full installer includes the app, plus the full set of cardsets and all of the extras.

<h2>Linux</h2>
<p>
PySolFC is available from <a href="https://flathub.org/apps/details/io.sourceforge.pysolfc.PySolFC">Flathub</a> (includes the full cardsets collection). Your Linux distribution may also provide their own package, though note that these packages may not always be fully up-to-date. Additionally, you can download a tarball from SourceForge.

<h2>Unix</h2>
<h2>Mac</h2>
<p>
You can download a .DMG package from SourceForge, and install it like any Mac application. Like with the Windows installer, a basic and full package are both available.

There are good chances that your system already ships with Python and Tcl/Tk.<br>
Otherwise visit
<a href="http://www.python.org/download/">http://www.python.org/download/</a>
for full source code.
<h2>Android</h2>
<p>
Also, installable packages exist for all major Linux distributions,
FreeBSD and HPUX.
An Android package is available to install from <a href="https://f-droid.org/packages/org.lufebe16.pysolfc/">F-Droid</a>.

<h2>Cardsets and Other Files</h2>
<p>
Additional cardsets, music, and settings are stored under <code>~/.PySolFC/</code> (or <code>%APPDATA%\PySolFC\</code> on Windows), organized as follows:
<ul>
<li><code>cardsets/</code> - cardsets and card images</li>
<li><code>music/</code> - background music tracks</li>
<li><code>tiles/</code> - table tile backgrounds</li>
<li><code>plugins/</code> - <a href="plugins.html">app plugins</a></li>
<li>Folders for saved games, options, and statistics</li>
</ul>
<p>
The app's install directory also contains bundled cardsets and data; the folders above are where per-user content and settings are stored.
<p>
You can download additional content from SourceForge, though the full collection is already included if you downloaded a full Windows/Mac package or the Flathub version:
<ul>
<li><a href="https://sourceforge.net/projects/pysolfc/files/PySolFC-Cardsets/">Cardsets</a></li>
<li><a href="https://sourceforge.net/projects/pysolfc/files/PySol-Music/">Music</a></li>
</ul>

<h2>Macintosh</h2>
<h2>Updating</h2>
<p>
You can check for new versions on the PySolFC website, the news page in the online documentation, along with the SourceForge/Flathub/F-Droid sites. Statistics, options, and user data in your PySolFC user folder will be retained across updates.

Self installing exectuables for Python and Tcl/Tk are available from<br>
<a href="http://www.python.org/download/download_mac.html">http://www.python.org/download/download_mac.html</a>
<h2>Running from Source</h2>
<p>
As I don't have access to a Mac I'd appreciate any detailed feedback on
installation and look & feel. "Porting" from X11 to Windows only required some
minor changes in the default font settings, so I hope the situation on Macs is
similar.
Developers can also run PySolFC from the source code. You can clone the <a href="https://github.com/shlomif/PySolFC">GitHub repository</a> and run
<code>python3 pysol.py</code> after installing Python 3.7+, Tkinter, and the <code>pysol-cards</code> package. See the repository's README for the full details.

<h2>Running from Command Line</h2>
<p>
[ I have been told that PySol works fine on a Mac - just drop "pysol.py"
on the Python interpreter and that's it. But for some reason you must
assign a large amount of memory to the Python interpreter. ]
A number of command line options are available for special run options, i.e. <code>pysol.py --game="FreeCell"</code>. Run with the <code>--help</code> command parameter for more details on the different options.

<h2>Troubleshooting</h2>
<p>
The following errors might occur during installation:
<ul>
<li>"No cardsets were found." - Install the cardsets package as described above.</li>
<li>If you are using a cardsets package from a Linux distribution, it may not align with the app if running from source or a different installer. Uninstall the distro's cardsets package and install the one from SourceForge.</li>
<li>If you get a missing cardset types warning, update the cardsets package. Certain games may not work properly otherwise.</li>
<li>See also the <a href="faq.html">FAQ</a>.</li>
</ul>
17 changes: 17 additions & 0 deletions html-src/news.html
Original file line number Diff line number Diff line change
@@ -1,6 +1,23 @@
<h1>What's New?</h1>
<ul>
<li>
<p><em>19 July, 2026:</em> There is a new stable release
<a href="https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-3.6.1/">PySolFC
v3.6.1</a>. New in this release:</p>
<ul>
<li>
<p>
Improved Python 3.14 support.
</p>
</li>
<li>
<p>
Many bugfixes.
</p>
</li>
</ul>
</li>
<li>
<p><em>13 June, 2026:</em> There is a new stable release
<a href="https://sourceforge.net/projects/pysolfc/files/PySolFC/PySolFC-3.6.0/">PySolFC
v3.6.0</a>. New in this release:</p>
Expand Down
3 changes: 2 additions & 1 deletion html-src/rules/antares.html
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,6 @@ <h3>Rules</h3>

<h3>History</h3>
<p>
Demons and Thieves is a combination of FreeCell-type and Scorpion-type
Antares is a combination of <a href="freecell.html">FreeCell type</a>
and <a href="scorpion.html">Scorpion type</a>
games. It was invented by Thomas Warfield.
3 changes: 2 additions & 1 deletion html-src/rules/demonsandthieves.html
Original file line number Diff line number Diff line change
Expand Up @@ -30,5 +30,6 @@ <h3>Rules</h3>

<h3>History</h3>
<p>
Demons and Thieves is a combination of Canfield-type and Forty Thieves-type
Demons and Thieves is a combination of <a href="canfield.html">Canfield type</a>
and <a href="fortythieves.html">Forty Thieves type</a>
games. It was invented by Thomas Warfield.
19 changes: 19 additions & 0 deletions po/de_pysol.po
Original file line number Diff line number Diff line change
Expand Up @@ -4030,6 +4030,25 @@ msgstr "Extra große Karten"
msgid "Hi-Res cardsets"
msgstr ""

msgid "Tiny"
msgstr ""

msgid "Small"
msgstr ""

msgctxt "size"
msgid "Medium"
msgstr ""

msgid "Large"
msgstr ""

msgid "Extra Large"
msgstr ""

msgid "Hi-Res"
msgstr ""

#: pysollib\pysolgtk\selectcardset.py:171 pysollib\tile\selectcardset.py:85
#: pysollib\tile\selectcardset.py:184 pysollib\tk\selectcardset.py:81
#: pysollib\tk\selectcardset.py:178
Expand Down
19 changes: 19 additions & 0 deletions po/fr_pysol.po
Original file line number Diff line number Diff line change
Expand Up @@ -4075,6 +4075,25 @@ msgstr "Cartes XL"
msgid "Hi-Res cardsets"
msgstr ""

msgid "Tiny"
msgstr ""

msgid "Small"
msgstr ""

msgctxt "size"
msgid "Medium"
msgstr ""

msgid "Large"
msgstr ""

msgid "Extra Large"
msgstr ""

msgid "Hi-Res"
msgstr ""

#: pysollib\pysolgtk\selectcardset.py:171 pysollib\tile\selectcardset.py:85
#: pysollib\tile\selectcardset.py:184 pysollib\tk\selectcardset.py:81
#: pysollib\tk\selectcardset.py:178
Expand Down
19 changes: 19 additions & 0 deletions po/it_pysol.po
Original file line number Diff line number Diff line change
Expand Up @@ -4133,6 +4133,25 @@ msgstr "Grandissime"
msgid "Hi-Res cardsets"
msgstr ""

msgid "Tiny"
msgstr ""

msgid "Small"
msgstr ""

msgctxt "size"
msgid "Medium"
msgstr ""

msgid "Large"
msgstr ""

msgid "Extra Large"
msgstr ""

msgid "Hi-Res"
msgstr ""

#: pysollib\pysolgtk\selectcardset.py:171 pysollib\tile\selectcardset.py:85
#: pysollib\tile\selectcardset.py:184 pysollib\tk\selectcardset.py:81
#: pysollib\tk\selectcardset.py:178
Expand Down
19 changes: 19 additions & 0 deletions po/pl_pysol.po
Original file line number Diff line number Diff line change
Expand Up @@ -4101,6 +4101,25 @@ msgstr "Bardzo duże zestawy kart"
msgid "Hi-Res cardsets"
msgstr "Wysoka rozdzielczość zestawu kart"

msgid "Tiny"
msgstr ""

msgid "Small"
msgstr ""

msgctxt "size"
msgid "Medium"
msgstr ""

msgid "Large"
msgstr ""

msgid "Extra Large"
msgstr ""

msgid "Hi-Res"
msgstr ""

#: pysollib\pysolgtk\selectcardset.py:171 pysollib\tile\selectcardset.py:85
#: pysollib\tile\selectcardset.py:184 pysollib\tk\selectcardset.py:81
#: pysollib\tk\selectcardset.py:178
Expand Down
19 changes: 19 additions & 0 deletions po/pt_BR_pysol.po
Original file line number Diff line number Diff line change
Expand Up @@ -4105,6 +4105,25 @@ msgstr "Sets de cartas extra grandes"
msgid "Hi-Res cardsets"
msgstr "Sets de cartas em alta resolução"

msgid "Tiny"
msgstr ""

msgid "Small"
msgstr ""

msgctxt "size"
msgid "Medium"
msgstr ""

msgid "Large"
msgstr ""

msgid "Extra Large"
msgstr ""

msgid "Hi-Res"
msgstr ""

#: pysollib\pysolgtk\selectcardset.py:171 pysollib\tile\selectcardset.py:85
#: pysollib\tile\selectcardset.py:184 pysollib\tk\selectcardset.py:81
#: pysollib\tk\selectcardset.py:178
Expand Down
19 changes: 19 additions & 0 deletions po/pysol.pot
Original file line number Diff line number Diff line change
Expand Up @@ -4436,6 +4436,25 @@ msgstr ""
msgid "Hi-Res cardsets"
msgstr ""

msgid "Tiny"
msgstr ""

msgid "Small"
msgstr ""

msgctxt "size"
msgid "Medium"
msgstr ""

msgid "Large"
msgstr ""

msgid "Extra Large"
msgstr ""

msgid "Hi-Res"
msgstr ""

#: pysollib\pysolgtk\selectcardset.py:171
#: pysollib\tile\selectcardset.py:85
#: pysollib\tile\selectcardset.py:184
Expand Down
Loading