Löve2d patch

Hey,
I’ve been working on a patchset to update love2d to 11.3 and then to 11.4

after haikuporter managed to destroy my patchset for the third time I simply don’t have the energy to finish it. I’m putting it here in the hopes that another interested party may finish it.

Goals of the patch:

  • update löve2d to 11.4
  • Remove B_SINGLE_LAUNCH | B_ARGV_ONLY;
    Single launch is uneccesary (works just fine with multiple games, or multiple times the same game running) and ARGV_ONLY is always wrong for GUI applications (it breaks screenshotting windows because the app_server can’t ask for the window dimensions), Additionally SDL2 processes BMessages just fine, and BMessages are required to get the game archive path for running archives.
  • Use the Love argv hack with the sdl filedrop event to enable running love2d game archives by double clicking
  • add a mimetype for love2d game archives for easy packaging of games
  • add proper Haiku integration for love2d, in particular implement stuff like letting lua know we run on Haiku, find the correct cache/data dir for games; add way to properly open links in browser, let love2d get the executable path etc.

Mainly I wrote this because I’d like to package my own love2d game for haiku as a .hpkg that can be directly downloaded from my git, and then run from it with double clicking. All without shipping the love2d executable in my repo.

I am available for any questions regarding this patch. :slight_smile:
(On another note, has anyone ported lövr yet?)

(and another note… composing this post has been quite annoying, I blame markdown and slow inefficient web apps)

From 346257ccad99d552eba705f42379a7be38744ad7 Mon Sep 17 00:00:00 2001
From: Pascal Abresch <nep@packageloss.eu>
Date: Wed, 6 Apr 2022 19:46:31 +0200
Subject: [PATCH] WIP: love2d

---
 .../love/additional-files/love.rdef.in        |   2 +-
 .../love/additional-files/x-love-game.rdef    |  26 +
 .../love/additional-files/x-love-game.rsrc    | Bin 0 -> 2647 bytes
 .../{love-11.2.recipe => love-11.4.recipe}    |  26 +-
 games-engines/love/patches/love-11.2.patchset | 136 -----
 games-engines/love/patches/love-11.4.patchset | 485 ++++++++++++++++++
 6 files changed, 528 insertions(+), 147 deletions(-)
 create mode 100644 games-engines/love/additional-files/x-love-game.rdef
 create mode 100644 games-engines/love/additional-files/x-love-game.rsrc
 rename games-engines/love/{love-11.2.recipe => love-11.4.recipe} (80%)
 delete mode 100644 games-engines/love/patches/love-11.2.patchset
 create mode 100644 games-engines/love/patches/love-11.4.patchset

diff --git a/games-engines/love/additional-files/love.rdef.in b/games-engines/love/additional-files/love.rdef.in
index f37650bdb..fc92699b0 100644
--- a/games-engines/love/additional-files/love.rdef.in
+++ b/games-engines/love/additional-files/love.rdef.in
@@ -1,5 +1,5 @@
 
-resource app_flags B_SINGLE_LAUNCH | B_ARGV_ONLY;
+resource app_flags B_MULTIPLE_LAUNCH;
 
 resource app_version {
 	major  = @MAJOR@,
diff --git a/games-engines/love/additional-files/x-love-game.rdef b/games-engines/love/additional-files/x-love-game.rdef
new file mode 100644
index 000000000..b5c7b60cd
--- /dev/null
+++ b/games-engines/love/additional-files/x-love-game.rdef
@@ -0,0 +1,26 @@
+
+resource(0, "BEOS:TYPE") #'MIMS' "application/x-vnd.Be-meta-mime";
+
+resource(1, "META:TYPE") "application/x-love-game";
+
+resource(2, "META:S:DESC") #'MSDC' "LÖVE game";
+
+resource(3, "META:L:DESC") #'MLDC' "A LÖVE based game archive";
+
+resource(4, "META:PREF_APP") #'MSIG' "application/x-vnd.love";
+
+resource(5, "META:ICON") #'VICN' array {
+	$"6E6369660403E74A9904004C0327AAE105FF040607FF1FC6D5B92DC6D5B92DC3"
+	$"E7B632BFB9B354C0A2B354BE55B354B382BF8BB382BE47B382C025B945C651B6"
+	$"52C358B982C62AB9F7C5CCB9BDC5FEBE5FC1A9C6D5B92DC38ABE34C6D5B92DB9"
+	$"2D0607FF1FC731B9B7C731B9B7C3E6BEBEBA53C655BEBBC233BA19C688B9A1C6"
+	$"DBB9DEC6B4BC6DC9AEC015CC4DBF57CC4DC1C3CC4DCC4DC015CC4DC130CC4DBF"
+	$"4DC731B9B7C9E5BC75C731B9B7B9B70607FF1FC6D5B92DC6D5B92DC38ABE34B9"
+	$"F7C5CCBE5FC1A9B9BDC5FEB945C651B982C62ABC11C925BFB9CBC3BEFBCBC3C1"
+	$"67CBC3CBF1BF8BCBF1C0A6CBF1BEC3C6D5B92DC989BBEBC6D5B92DB92D0608FE"
+	$"7FC01BBCBABCCABAE8BF08BA5FBA8CBB71BFC1C5B8B5DEC005BFC1C5B8BFBFC5"
+	$"B840C5B8C9A2C005C2B7BAE8C4F4BB71C079BA5FBF66BCBABF66BCBABFA2BCBA"
+	$"C01BBCBABFDFBCBAC01BBCBABCBA040A000100000A010101000A020102000A03"
+	$"010300"
+};
+
diff --git a/games-engines/love/additional-files/x-love-game.rsrc b/games-engines/love/additional-files/x-love-game.rsrc
new file mode 100644
index 0000000000000000000000000000000000000000..2a485a83b68ded62e243c3bd84e615285e4d3545
GIT binary patch
literal 2647
zcmeHJPiWI%6#vpcTNg$2ASyeommvuC|7j<?G>%HM)+U>JDzWRf!rE;*i=KpfQRht%
zJlcbxh?nTvFO5mM*l0};UOXui5#2-(3W5h=^?OOJ)RPFi<%7rj<^8_*dykJ7cu5{1
zv@;&*BQ634;6D!JB9i;X>uAhU4u)`>9EfiPzBYi+Ya$H#kNOcBa>^i!;JqFEk>G6|
z{Egtj4ju>~w5NlE1gA;Qzt2|o3^iPR=cV0uaNoh50e1%68Thvu5EmBavT1QCJD)#v
zIaJ6`9URSsa+xJDl*{HasF$9bFJwY9B8kV0JCkhChT)*|abCQbnX*Gc@j`kwTlhO0
z#6bb&)7fdCcm32|ABuVRKm6ct`}+FZL*^SC0yEZEj%rvE^pYf~6OtemwPmTOj!8v*
z7_;W-m85YN7tI6sN4<%k)i>2t?SY+lQ#}qIhd}Mc5nKi{KC7zCn-gkv^_aZRypHdg
zZ}FP>M9DQC>${trcBaYIj3(FQ;H!3+L^#N6d{Qof$K{^hNDZh9HK8{21HCA_8p9g4
z4E3jF)MhNhYH7<>OTTZmR0Dcy+^Bx-^cL8>st+o%@=D&&0&+^eRbA9-^~%#V-49;V
z>Xj4qN~5IvSIhFo^Y7I~{feB@rWM(?k|IO8_TKS|?4uFcGiZvU5bdEni1t!m#B)&&
z1^_k?8jZ4XendEzVC^*levPESGr)Olo@0e@FV94H4mjAdwj-P8M<OiGbQPFLj04v9
x=SHme##of+fb|pG;b<h1?8#I(k?5+7Gto)lVN0Z)J5eS+-sRtUUfw1Y`UL_GCMf^_

literal 0
HcmV?d00001

diff --git a/games-engines/love/love-11.2.recipe b/games-engines/love/love-11.4.recipe
similarity index 80%
rename from games-engines/love/love-11.2.recipe
rename to games-engines/love/love-11.4.recipe
index e8c7a316d..db2230ac9 100644
--- a/games-engines/love/love-11.2.recipe
+++ b/games-engines/love/love-11.4.recipe
@@ -2,13 +2,14 @@ SUMMARY="A framework to make 2D games in Lua"
 DESCRIPTION="LÖVE is a framework to make 2D games in Lua.
 It's free, open-source, and works also on Windows, Mac OS X and Linux."
 HOMEPAGE="http://love2d.org/"
-COPYRIGHT="2010-2018 Löve"
+COPYRIGHT="2010-2022 Löve"
 LICENSE="Zlib"
-REVISION="3"
-SOURCE_URI="https://bitbucket.org/rude/love/downloads/love-$portVersion-linux-src.tar.gz"
-CHECKSUM_SHA256="6aaf8104fc35bb8bbd7865986b98079e7564ffdb374ea4d33604b46b458444f6"
-PATCHES="love-$portVersion.patchset"
-ADDITIONAL_FILES="love.rdef.in"
+REVISION="1"
+SOURCE_URI="https://github.com/love2d/love/releases/download/${portVersion}/love-${portVersion}-linux-src.tar.gz"
+CHECKSUM_SHA256="e32feecaf5f4f210242a4b5f26cdf9ce9014bfde18d51286f643bb7fe51f5369"
+PATCHES="love-${portVersion}.patchset"
+ADDITIONAL_FILES="love.rdef.in
+x-love-game.rsrc"
 
 ARCHITECTURES="all !x86_gcc2"
 SECONDARY_ARCHITECTURES="x86"
@@ -16,7 +17,7 @@ SECONDARY_ARCHITECTURES="x86"
 PROVIDES="
 	love$secondaryArchSuffix = $portVersion
 	cmd:love$secondaryArchSuffix = $portVersion
-	lib:liblove_11.2$secondaryArchSuffix = $portVersion
+	lib:liblove_11.4$secondaryArchSuffix = $portVersion
 	"
 REQUIRES="
 	haiku$secondaryArchSuffix
@@ -45,7 +46,7 @@ REQUIRES="
 PROVIDES_devel="
 	love${secondaryArchSuffix}_devel = $portVersion
 	devel:liblove$secondaryArchSuffix = $portVersion
-	devel:liblove_11.2$secondaryArchSuffix = $portVersion
+	devel:liblove_11.4$secondaryArchSuffix = $portVersion
 	"
 REQUIRES_devel="
 	love$secondaryArchSuffix == $portVersion base
@@ -105,7 +106,12 @@ INSTALL()
 	rm -f $libDir/*.la
 
 	# remove not relevant files
-	rm -rf $dataDir/{applications,icons,pixmaps}
+	rm -rf $dataDir/{applications,icons,pixmaps,mime}
+
+	# copy mimetype rsrc for love2d games
+	mkdir -p $dataDir/mime_db/application/
+	resattr -o $dataDir/mime_db/application/x-love-game $portDir/additional-files/x-love-game.rsrc
+
 
 	local MAJOR="`echo "$portVersion" | cut -d. -f1`"
 	local MIDDLE="`echo "$portVersion" | cut -d. -f2`"
@@ -118,7 +124,7 @@ INSTALL()
 
 	addResourcesToBinaries love.rdef $binDir/love
 
-	prepareInstalledDevelLibs liblove-11.2 liblove
+	prepareInstalledDevelLibs liblove-11.4 liblove
 
 	packageEntries devel \
 		$developDir
diff --git a/games-engines/love/patches/love-11.2.patchset b/games-engines/love/patches/love-11.2.patchset
deleted file mode 100644
index 886555318..000000000
--- a/games-engines/love/patches/love-11.2.patchset
+++ /dev/null
@@ -1,136 +0,0 @@
-From c54427cc117d031d9eb3dbce07340de9229660ba Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
-Date: Sat, 6 May 2017 11:09:02 +0200
-Subject: Add Haiku to the known platforms
-
-
-diff --git a/src/common/config.h b/src/common/config.h
-index 8180f6a..72b2496 100644
---- a/src/common/config.h
-+++ b/src/common/config.h
-@@ -48,7 +48,7 @@
- #		define LOVE_MACOSX 1
- #	endif
- #endif
--#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__)
-+#if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__HAIKU__)
- // I know it's not linux, but it seems most "linux-only" code is bsd-compatible
- #	define LOVE_LINUX 1
- #endif
--- 
-2.30.0
-
-
-From a975efb2a9af608abb8c0e9a213ff27fa04037e8 Mon Sep 17 00:00:00 2001
-From: =?UTF-8?q?Zolt=C3=A1n=20Mizsei?= <zmizsei@extrowerk.com>
-Date: Sat, 6 May 2017 11:18:30 +0200
-Subject: Build fix for Haiku
-
-
-diff --git a/src/modules/system/System.cpp b/src/modules/system/System.cpp
-index d85a947..3a9d441 100644
---- a/src/modules/system/System.cpp
-+++ b/src/modules/system/System.cpp
-@@ -39,8 +39,10 @@
- #if defined(LOVE_ANDROID)
- #include "common/android.h"
- #elif defined(LOVE_LINUX)
-+#ifndef __HAIKU__
- #include <spawn.h>
- #endif
-+#endif
- 
- namespace love
- {
-@@ -106,8 +108,10 @@ bool System::openURL(const std::string &url) const
- 
- 	// Note: at the moment this process inherits our file descriptors.
- 	// Note: the below const_cast is really ugly as well.
-+	#ifndef __HAIKU__
- 	if (posix_spawnp(&pid, "xdg-open", nullptr, nullptr, const_cast<char **>(argv), environ) != 0)
- 		return false;
-+	#endif
- 
- 	// Check if xdg-open already completed (or failed.)
- 	int status = 0;
--- 
-2.30.0
-
-
-From fefdfa8ca95a20e939de01dcd9a1a729d93c9ce0 Mon Sep 17 00:00:00 2001
-From: begasus <begasus@gmail.com>
-Date: Fri, 26 Apr 2019 19:14:39 +0200
-Subject: Build fix for Haiku #2
-
-
-diff --git a/src/libraries/luasocket/libluasocket/compat.h b/src/libraries/luasocket/libluasocket/compat.h
-index 7bf8010..9e3b43f 100644
---- a/src/libraries/luasocket/libluasocket/compat.h
-+++ b/src/libraries/luasocket/libluasocket/compat.h
-@@ -5,6 +5,8 @@
- #include "lauxlib.h"
- 
- #if LUA_VERSION_NUM==501
-+#define luaL_setfuncs socket_setfuncs
-+#define luaL_testudata socket_testudata
- void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
- #endif
- 
--- 
-2.30.0
-
-
-From 823e7ebebfafc3b11e0d125671a8f00310a71e7f Mon Sep 17 00:00:00 2001
-From: Jerome Duval <jerome.duval@gmail.com>
-Date: Sun, 14 Feb 2021 11:49:17 +0100
-Subject: links against libnetwork
-
-
-diff --git a/configure.ac b/configure.ac
-index 781680c..9fbaeb1 100644
---- a/configure.ac
-+++ b/configure.ac
-@@ -64,6 +64,7 @@ ACLOVE_DEP_SDL2
- ACLOVE_DEP_LIBM
- ACLOVE_DEP_ZLIB
- ACLOVE_DEP_PTHREAD
-+ACLOVE_DEP_SOCKET
- 
- # Conditional dependencies
- AS_VAR_IF([enable_module_audio], [yes], [ACLOVE_DEP_OPENAL], [])
-diff --git a/platform/unix/deps.m4 b/platform/unix/deps.m4
-index 42938d9..af4c10f 100644
---- a/platform/unix/deps.m4
-+++ b/platform/unix/deps.m4
-@@ -25,6 +25,16 @@ AC_DEFUN([ACLOVE_DEP_SDL2], [
- AC_DEFUN([ACLOVE_DEP_PTHREAD], [
- 	AC_SEARCH_LIBS([pthread_create], [pthread], [], [LOVE_MSG_ERROR([the POSIX threads library])])])
- 
-+AC_DEFUN([ACLOVE_DEP_SOCKET], [
-+  AC_CHECK_FUNCS(connect,,[
-+    AC_CHECK_LIB(network,connect,[
-+      LIBS_SOCKET="-lnetwork"
-+      AC_SUBST([LIBS_SOCKET],[])
-+    ])
-+  ])
-+])
-+
-+
- # does not use pkg-config because of the FILE_OFFSET_BITS.. bit
- AC_DEFUN([ACLOVE_DEP_MPG123], [
- 	AC_SEARCH_LIBS([mpg123_open_feed], [mpg123], [],
-diff --git a/src/Makefile.am b/src/Makefile.am
-index 0d87ac4..df3e874 100644
---- a/src/Makefile.am
-+++ b/src/Makefile.am
-@@ -1023,6 +1023,7 @@ endif
- 
- if LOVE_LIBRARY_LUASOCKET
- liblove_la_SOURCES += $(liblove_library_luasocket)
-+liblove_la_LIBADD += $(LIBS_SOCKET)
- endif
- 
- if LOVE_LIBRARY_LZ4
--- 
-2.30.0
-
diff --git a/games-engines/love/patches/love-11.4.patchset b/games-engines/love/patches/love-11.4.patchset
new file mode 100644
index 000000000..2c9ab2cc0
--- /dev/null
+++ b/games-engines/love/patches/love-11.4.patchset
@@ -0,0 +1,485 @@
+From 244eef63889592db0e8d513b24780e886acbcce2 Mon Sep 17 00:00:00 2001
+From: begasus <begasus@gmail.com>
+Date: Fri, 26 Apr 2019 19:14:39 +0200
+Subject: Build fix for Haiku #2
+
+
+diff --git a/src/libraries/luasocket/libluasocket/compat.h b/src/libraries/luasocket/libluasocket/compat.h
+index 7bf8010..9e3b43f 100644
+--- a/src/libraries/luasocket/libluasocket/compat.h
++++ b/src/libraries/luasocket/libluasocket/compat.h
+@@ -5,6 +5,8 @@
+ #include "lauxlib.h"
+ 
+ #if LUA_VERSION_NUM==501
++#define luaL_setfuncs socket_setfuncs
++#define luaL_testudata socket_testudata
+ void luaL_setfuncs (lua_State *L, const luaL_Reg *l, int nup);
+ #endif
+ 
+-- 
+2.30.2
+
+
+From cb13079abfba285ec1a3ed2eb39d055dba7bce5f Mon Sep 17 00:00:00 2001
+From: Jerome Duval <jerome.duval@gmail.com>
+Date: Sun, 14 Feb 2021 11:49:17 +0100
+Subject: links against libnetwork
+
+
+diff --git a/configure.ac b/configure.ac
+index 89ad64b..5275899 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -64,6 +64,7 @@ ACLOVE_DEP_SDL2
+ ACLOVE_DEP_LIBM
+ ACLOVE_DEP_ZLIB
+ ACLOVE_DEP_PTHREAD
++ACLOVE_DEP_SOCKET
+ 
+ # Conditional dependencies
+ AS_VAR_IF([enable_module_audio], [yes], [ACLOVE_DEP_OPENAL], [])
+diff --git a/platform/unix/deps.m4 b/platform/unix/deps.m4
+index fbfb1c9..430fc0e 100644
+--- a/platform/unix/deps.m4
++++ b/platform/unix/deps.m4
+@@ -27,6 +27,16 @@ AC_DEFUN([ACLOVE_DEP_SDL2], [
+ AC_DEFUN([ACLOVE_DEP_PTHREAD], [
+ 	AC_SEARCH_LIBS([pthread_create], [pthread], [], [LOVE_MSG_ERROR([the POSIX threads library])])])
+ 
++AC_DEFUN([ACLOVE_DEP_SOCKET], [
++  AC_CHECK_FUNCS(connect,,[
++    AC_CHECK_LIB(network,connect,[
++      LIBS_SOCKET="-lnetwork"
++      AC_SUBST([LIBS_SOCKET],[])
++    ])
++  ])
++])
++
++
+ # does not use pkg-config because of the FILE_OFFSET_BITS.. bit
+ AC_DEFUN([ACLOVE_DEP_MPG123], [
+ 	AC_SEARCH_LIBS([mpg123_open_feed], [mpg123], [],
+diff --git a/src/Makefile.am b/src/Makefile.am
+index 1d822b7..461ced1 100644
+--- a/src/Makefile.am
++++ b/src/Makefile.am
+@@ -1041,6 +1041,7 @@ endif
+ 
+ if LOVE_LIBRARY_LUASOCKET
+ liblove_la_SOURCES += $(liblove_library_luasocket)
++liblove_la_LIBADD += $(LIBS_SOCKET)
+ endif
+ 
+ if LOVE_LIBRARY_LZ4
+-- 
+2.30.2
+
+
+From 1978ba3b5759ef16403a160b582fa25ec18047f3 Mon Sep 17 00:00:00 2001
+From: Pascal Abresch <nep@packageloss.eu>
+Date: Mon, 14 Mar 2022 11:11:24 +0100
+Subject: Add Haiku support
+
+
+diff --git a/src/common/config.h b/src/common/config.h
+index 5aef35f..e9ff75f 100644
+--- a/src/common/config.h
++++ b/src/common/config.h
+@@ -52,7 +52,9 @@
+ // I know it's not linux, but it seems most "linux-only" code is bsd-compatible
+ #	define LOVE_LINUX 1
+ #endif
+-
++#if defined(__HAIKU__)
++#	define LOVE_HAIKU 1
++#endif
+ // Endianness.
+ #if defined(__ppc__) || defined(__ppc) || defined(__powerpc__) || defined(__powerpc)
+ #	define LOVE_BIG_ENDIAN 1
+@@ -164,7 +166,7 @@
+ #endif
+ 
+ // Check we have a sane configuration
+-#if !defined(LOVE_WINDOWS) && !defined(LOVE_LINUX) && !defined(LOVE_IOS) && !defined(LOVE_MACOSX) && !defined(LOVE_ANDROID)
++#if !defined(LOVE_WINDOWS) && !defined(LOVE_LINUX) && !defined(LOVE_IOS) && !defined(LOVE_MACOSX) && !defined(LOVE_ANDROID) && !defined(LOVE_ANDROID)
+ #	error Could not detect target platform
+ #endif
+ #if !defined(LOVE_LITTLE_ENDIAN) && !defined(LOVE_BIG_ENDIAN)
+diff --git a/src/modules/audio/openal/Audio.cpp b/src/modules/audio/openal/Audio.cpp
+index 3f8193f..5af5afe 100644
+--- a/src/modules/audio/openal/Audio.cpp
++++ b/src/modules/audio/openal/Audio.cpp
+@@ -100,7 +100,7 @@ Audio::Audio()
+ 	, poolThread(nullptr)
+ 	, distanceModel(DISTANCE_INVERSE_CLAMPED)
+ {
+-#if defined(LOVE_LINUX)
++#if defined(LOVE_LINUX) || defined(LOVE_HAIKU)
+ 	// Temporarly block signals, as the thread inherits this mask
+ 	love::thread::disableSignals();
+ #endif
+@@ -134,7 +134,7 @@ Audio::Audio()
+ 	if (!alcMakeContextCurrent(context) || alcGetError(device) != ALC_NO_ERROR)
+ 		throw love::Exception("Could not make context current.");
+ 
+-#if defined(LOVE_LINUX)
++#if defined(LOVE_LINUX) || defined(LOVE_HAIKU)
+ 	love::thread::reenableSignals();
+ #endif
+ 
+diff --git a/src/modules/filesystem/Filesystem.cpp b/src/modules/filesystem/Filesystem.cpp
+index a80d33c..4f9fe01 100644
+--- a/src/modules/filesystem/Filesystem.cpp
++++ b/src/modules/filesystem/Filesystem.cpp
+@@ -33,6 +33,8 @@
+ #elif defined(LOVE_WINDOWS)
+ #include <windows.h>
+ #include "common/utf8.h"
++#elif defined(LOVE_HAIKU)
++#include <Application.h>
+ #elif defined(LOVE_LINUX)
+ #include <unistd.h>
+ #endif
+@@ -105,6 +107,14 @@ std::string Filesystem::getExecutablePath() const
+ 
+ 	return to_utf8(buffer);
+ 
++#elif defined(LOVE_HAIKU)
++	app_info info;
++	if (be_app->GetAppInfo(&info) != B_OK)
++		return "";
++
++	BPath entry(&info.ref);
++	return entry.Path();
++
+ #elif defined(LOVE_LINUX)
+ 
+ 	char buffer[2048] = {0};
+diff --git a/src/modules/filesystem/Filesystem.h b/src/modules/filesystem/Filesystem.h
+index 5952a06..bb9e070 100644
+--- a/src/modules/filesystem/Filesystem.h
++++ b/src/modules/filesystem/Filesystem.h
+@@ -43,7 +43,7 @@
+ #else
+ #	if defined(LOVE_MACOSX) || defined(LOVE_IOS)
+ #		define LOVE_APPDATA_FOLDER "LOVE"
+-#	elif defined(LOVE_LINUX)
++#	elif defined(LOVE_LINUX) || defined(LOVE_HAIKU)
+ #		define LOVE_APPDATA_FOLDER "love"
+ #	else
+ #		define LOVE_APPDATA_PREFIX "."
+diff --git a/src/modules/filesystem/physfs/Filesystem.cpp b/src/modules/filesystem/physfs/Filesystem.cpp
+index b48c80a..7bf460b 100644
+--- a/src/modules/filesystem/physfs/Filesystem.cpp
++++ b/src/modules/filesystem/physfs/Filesystem.cpp
+@@ -534,6 +534,8 @@ std::string Filesystem::getAppdataDirectory()
+ 		appdata = normalize(udir);
+ #elif defined(LOVE_IOS)
+ 		appdata = normalize(love::ios::getAppdataDirectory());
++#elif defined(LOVE_HAIKU)
++		find_directory(B_USER_DATA_DIRECTORY, &appdata);
+ #elif defined(LOVE_LINUX)
+ 		char *xdgdatahome = getenv("XDG_DATA_HOME");
+ 		if (!xdgdatahome)
+diff --git a/src/modules/graphics/opengl/OpenGL.cpp b/src/modules/graphics/opengl/OpenGL.cpp
+index bf2e715..067239e 100644
+--- a/src/modules/graphics/opengl/OpenGL.cpp
++++ b/src/modules/graphics/opengl/OpenGL.cpp
+@@ -149,7 +149,7 @@ bool OpenGL::initContext()
+ 
+ 	initOpenGLFunctions();
+ 
+-#if defined(LOVE_WINDOWS) || defined(LOVE_LINUX)
++#if defined(LOVE_WINDOWS) || defined(LOVE_LINUX) || defined(HAIKU)
+ 	// See the comments in OpenGL.h.
+ 	if (getVendor() == VENDOR_AMD)
+ 	{
+diff --git a/src/modules/love/love.cpp b/src/modules/love/love.cpp
+index a75d3c9..858226a 100644
+--- a/src/modules/love/love.cpp
++++ b/src/modules/love/love.cpp
+@@ -490,6 +490,8 @@ int luaopen_love(lua_State *L)
+ 	lua_pushstring(L, "Android");
+ #elif defined(LOVE_LINUX)
+ 	lua_pushstring(L, "Linux");
++#elif defined(LOVE_HAIKU)
++	lua_pushstring(L, "Haiku");
+ #else
+ 	lua_pushstring(L, "Unknown");
+ #endif
+diff --git a/src/modules/system/System.cpp b/src/modules/system/System.cpp
+index 981dcff..caae6a1 100644
+--- a/src/modules/system/System.cpp
++++ b/src/modules/system/System.cpp
+@@ -26,6 +26,8 @@
+ #include <CoreServices/CoreServices.h>
+ #elif defined(LOVE_IOS)
+ #include "common/ios.h"
++#elif defined(LOVE_HAIKU)
++#include <Url.h>
+ #elif defined(LOVE_LINUX) || defined(LOVE_ANDROID)
+ #include <signal.h>
+ #include <sys/wait.h>
+@@ -76,6 +78,8 @@ std::string System::getOS() const
+ 	return "Android";
+ #elif defined(LOVE_LINUX)
+ 	return "Linux";
++#elif defined(LOVE_HAIKU)
++	return "Haiku";
+ #else
+ 	return "Unknown";
+ #endif
+@@ -112,6 +116,11 @@ bool System::openURL(const std::string &url) const
+ 
+ 	return love::android::openURL(url);
+ 
++#elif defined(LOVE_HAIKU)
++
++	BUrl bUrl(*url);
++	return bUrl.OpenWithPreferredApplication() == B_OK)
++
+ #elif defined(LOVE_LINUX)
+ 
+ 	pid_t pid;
+diff --git a/src/modules/thread/sdl/Thread.cpp b/src/modules/thread/sdl/Thread.cpp
+index cfc63e3..226bae0 100644
+--- a/src/modules/thread/sdl/Thread.cpp
++++ b/src/modules/thread/sdl/Thread.cpp
+@@ -42,7 +42,7 @@ Thread::~Thread()
+ 
+ bool Thread::start()
+ {
+-#if defined(LOVE_LINUX)
++#if defined(LOVE_LINUX) || defined(LOVE_HAIKU)
+ 	// Temporarly block signals, as the thread inherits this mask
+ 	love::thread::disableSignals();
+ #endif
+@@ -55,7 +55,7 @@ bool Thread::start()
+ 	thread = SDL_CreateThread(thread_runner, t->getThreadName(), this);
+ 	running = (thread != nullptr);
+ 
+-#if defined(LOVE_LINUX)
++#if defined(LOVE_LINUX) || defined(LOVE_HAIKU)
+ 	love::thread::reenableSignals();
+ #endif
+ 	return running;
+diff --git a/src/modules/thread/threads.cpp b/src/modules/thread/threads.cpp
+index f680d08..9e92347 100644
+--- a/src/modules/thread/threads.cpp
++++ b/src/modules/thread/threads.cpp
+@@ -20,7 +20,7 @@
+ 
+ #include "threads.h"
+ 
+-#if defined(LOVE_LINUX)
++#if defined(LOVE_LINUX) || defined(LOVE_HAIKU)
+ #include <signal.h>
+ #endif
+ 
+@@ -157,7 +157,7 @@ Conditional *ConditionalRef::operator->() const
+ 	return conditional;
+ }
+ 
+-#if defined(LOVE_LINUX)
++#if defined(LOVE_LINUX) || defined(LOVE_HAIKU)
+ static sigset_t oldset;
+ 
+ void disableSignals()
+diff --git a/src/modules/thread/threads.h b/src/modules/thread/threads.h
+index 5f607ba..cde0ab8 100644
+--- a/src/modules/thread/threads.h
++++ b/src/modules/thread/threads.h
+@@ -129,7 +129,7 @@ Mutex *newMutex();
+ Conditional *newConditional();
+ Thread *newThread(Threadable *t);
+ 
+-#if defined(LOVE_LINUX)
++#if defined(LOVE_LINUX) || defined(LOVE_HAIKU)
+ void disableSignals();
+ void reenableSignals();
+ #endif
+diff --git a/src/modules/timer/Timer.cpp b/src/modules/timer/Timer.cpp
+index 48d1d5f..a8b1c2e 100644
+--- a/src/modules/timer/Timer.cpp
++++ b/src/modules/timer/Timer.cpp
+@@ -30,7 +30,7 @@
+ #elif defined(LOVE_MACOSX) || defined(LOVE_IOS)
+ #include <mach/mach_time.h>
+ #include <sys/time.h>
+-#elif defined(LOVE_LINUX)
++#elif defined(LOVE_LINUX) || defined(LOVE_HAIKU)
+ #include <unistd.h>
+ #include <time.h>
+ #include <sys/time.h>
+@@ -101,7 +101,7 @@ double Timer::getAverageDelta() const
+ 	return averageDelta;
+ }
+ 
+-#if defined(LOVE_LINUX)
++#if defined(LOVE_LINUX) || defined(LOVE_HAIKU)
+ 
+ static inline timespec getTimeOfDay()
+ {
+-- 
+2.30.2
+
+
+From fb9e50cfde1e261089bb88040f81f93c1be739eb Mon Sep 17 00:00:00 2001
+From: Pascal Abresch <nep@packageloss.eu>
+Date: Mon, 14 Mar 2022 12:05:13 +0100
+Subject: Add ARGV hack for Haiku
+
+
+diff --git a/src/common/config.h b/src/common/config.h
+index e9ff75f..d2a3a04 100644
+--- a/src/common/config.h
++++ b/src/common/config.h
+@@ -119,7 +119,7 @@
+ #	define NOMINMAX
+ #endif
+ 
+-#if defined(LOVE_MACOSX) || defined(LOVE_IOS)
++#if defined(LOVE_MACOSX) || defined(LOVE_IOS) || defined(HAIKU)
+ #	define LOVE_LEGENDARY_APP_ARGV_HACK
+ #endif
+ 
+diff --git a/src/common/haiku.cpp b/src/common/haiku.cpp
+new file mode 100644
+index 0000000..715949a
+--- /dev/null
++++ b/src/common/haiku.cpp
+@@ -0,0 +1,58 @@
++/**
++ * Copyright (c) 2006-2022 LOVE Development Team
++ *
++ * This software is provided 'as-is', without any express or implied
++ * warranty.  In no event will the authors be held liable for any damages
++ * arising from the use of this software.
++ *
++ * Permission is granted to anyone to use this software for any purpose,
++ * including commercial applications, and to alter it and redistribute it
++ * freely, subject to the following restrictions:
++ *
++ * 1. The origin of this software must not be misrepresented; you must not
++ *    claim that you wrote the original software. If you use this software
++ *    in a product, an acknowledgment in the product documentation would be
++ *    appreciated but is not required.
++ * 2. Altered source versions must be plainly marked as such, and must not be
++ *    misrepresented as being the original software.
++ * 3. This notice may not be removed or altered from any source distribution.
++ **/
++
++#include "haiku.h"
++
++#ifdef LOVE_HAIKU
++
++#include <SDL2/SDL.h>
++
++namespace love
++{
++namespace haiku
++{
++
++
++std::string checkDropEvents()
++{
++	std::string dropstr;
++	SDL_Event event;
++
++	SDL_InitSubSystem(SDL_INIT_VIDEO);
++
++	SDL_PumpEvents();
++	if (SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_DROPFILE, SDL_DROPFILE) > 0)
++	{
++		if (event.type == SDL_DROPFILE)
++		{
++			dropstr = std::string(event.drop.file);
++			SDL_free(event.drop.file);
++		}
++	}
++
++	SDL_QuitSubSystem(SDL_INIT_VIDEO);
++
++	return dropstr;
++}
++
++} // haiku
++} // love
++
++#endif // LOVE_HAIKU
+diff --git a/src/common/haiku.h b/src/common/haiku.h
+new file mode 100644
+index 0000000..1cf6bdc
+--- /dev/null
++++ b/src/common/haiku.h
+@@ -0,0 +1,46 @@
++/**
++ * Copyright (c) 2006-2022 LOVE Development Team
++ *
++ * This software is provided 'as-is', without any express or implied
++ * warranty.  In no event will the authors be held liable for any damages
++ * arising from the use of this software.
++ *
++ * Permission is granted to anyone to use this software for any purpose,
++ * including commercial applications, and to alter it and redistribute it
++ * freely, subject to the following restrictions:
++ *
++ * 1. The origin of this software must not be misrepresented; you must not
++ *    claim that you wrote the original software. If you use this software
++ *    in a product, an acknowledgment in the product documentation would be
++ *    appreciated but is not required.
++ * 2. Altered source versions must be plainly marked as such, and must not be
++ *    misrepresented as being the original software.
++ * 3. This notice may not be removed or altered from any source distribution.
++ **/
++
++#ifndef LOVE_HAIKU_H
++#define LOVE_HAIKU_H
++
++#include "config.h"
++
++#ifdef LOVE_HAIKU
++
++#include <string>
++
++namespace love
++{
++namespace haiku
++{
++
++/**
++ * Checks for drop-file events. Returns the filepath if an event occurred, or
++ * an empty string otherwise.
++ **/
++std::string checkDropEvents();
++
++} // haiku
++} // love
++
++#endif // LOVE_HAIKU
++
++#endif // LOVE_HAIKU_H
+diff --git a/src/love.cpp b/src/love.cpp
+index c8af859..7c0f5c3 100644
+--- a/src/love.cpp
++++ b/src/love.cpp
+@@ -108,7 +108,14 @@ static void get_app_arguments(int argc, char **argv, int &new_argc, char **&new_
+ 		}
+ 	}
+ #endif
+-
++#ifdef LOVE_HAIKU
++	else
++	{
++		static std::string dropfilestr = love::haiku::checkDropEvents();
++		if (!dropfilestr.empty())
++			temp_argv.insert(temp_argv.begin() +1, dropfilestr);
++	}
++#endif
+ 	// Copy temp argv vector to new argv array.
+ 	new_argc = (int) temp_argv.size();
+ 	new_argv = new char *[new_argc+1];
+-- 
+2.30.2
+
-- 
2.30.2


2 Likes

I want to try it, maybe I’ll have better luck.

1 Like

I’ve done a small part directly now Love2d: enable multiple launch by nephele-gh · Pull Request #7279 · haikuports/haikuports · GitHub

This atleast acomplishes running the engine multiple times at once (required for my game atleast)

2 Likes

Is your game available? What is it called, would like to try it.

I wish people didn’t delete old recipes. love2d does not maintain compatibility between releases. If you only have the latest version, older games will not run.

11.2 and 11.4 should be compatible.

If you want the older version of the recipes you can check the git log of the respective directory, switch to an earlier revision and then take the earlier version. beware though that it may require earlier libs aswell.

for example: History for games-engines/love - haikuports/haikuports · GitHub

and from this you can get 0.9.1 for example

Yes it is available on my git repo, it is called poppy. I have a newer commit i want to upload though. I’ll tell you when that is done

1 Like

I can work around it, but I’m wondering why it was deleted in the first place.

Likely that the commiter was not aware of this, you can create an issue asking for it to be reinstated though

I’ve uploaded the version to git, it should run : )
Here is the uri: Poppy/poppy-client: A client for poppy - poppy-client - GryphNode

You have to use two instances of the game, with “love path/to/game” respectively, first the server and then the client but you can use severall clients if you want.

Be aware that this is still a development build with bugs and in an unfinished state

1 Like

The main problem I’ve been noticing is the annoyance of the fact that love2d isnt able to use the get height of the screen function which makes it harder to run certain games, requiring many manual changes if the function keeps getting used. Though got many games to work with the current version of Love! It also makes it possible to run commercial games with how easy it is to get to the source code and just run it with love (got a few to work properly)

@nephele looking into importing your patch to löve 11.5, so far with the curent patch (with one dropped in there) it’s already launching games, but haven’t been able to test your game yet, will keep you informed. :slight_smile:

Would be interesting if you can launch your test game .love archive with open or doubleclick after you add application/x-love-game as mimetype :slight_smile:

I can test my game at some point, don‘t think you need to bother with that

Running into problems compiling with the added “Add ARGV hack for Haiku”, getting compiler errors :wink:

modules/filesystem/Filesystem.cpp:111:18: error: aggregate 'app_info info' has incomplete type and cannot be defined
  111 |         app_info info;
      |                  ^~~~
modules/filesystem/Filesystem.cpp:115:20: error: variable 'BPath entry' has initializer but incomplete type
  115 |         BPath entry(&info.ref);
      |                    ^
Makefile:4884: recipe for target 'modules/filesystem/Filesystem.lo' failed
make[3]: *** [modules/filesystem/Filesystem.lo] Error 1
make[3]: *** Waiting for unfinished jobs....
modules/filesystem/physfs/Filesystem.cpp: In member function 'virtual std::string love::filesystem::physfs::Filesystem::getUserDirectory()':
modules/filesystem/physfs/Filesystem.cpp:540:65: warning: 'const char* PHYSFS_getUserDir()' is deprecated [-Wdeprecated-declarations]
  540 |         static std::string userDir = normalize(PHYSFS_getUserDir());
      |                                                ~~~~~~~~~~~~~~~~~^~
In file included from modules/filesystem/physfs/File.h:29,
                 from modules/filesystem/physfs/Filesystem.cpp:29:
./libraries/physfs/physfs.h:822:25: note: declared here
  822 | PHYSFS_DECL const char *PHYSFS_getUserDir(void) PHYSFS_DEPRECATED;
      |                         ^~~~~~~~~~~~~~~~~
modules/filesystem/physfs/Filesystem.cpp: In member function 'virtual std::string love::filesystem::physfs::Filesystem::getAppdataDirectory()':
modules/filesystem/physfs/Filesystem.cpp:563:32: error: 'B_USER_DATA_DIRECTORY' was not declared in this scope; did you mean 'B_IS_A_DIRECTORY'?
  563 |                 find_directory(B_USER_DATA_DIRECTORY, &appdata);
      |                                ^~~~~~~~~~~~~~~~~~~~~
      |                                B_IS_A_DIRECTORY
modules/filesystem/physfs/Filesystem.cpp:563:17: error: 'find_directory' was not declared in this scope
  563 |                 find_directory(B_USER_DATA_DIRECTORY, &appdata);
      |                 ^~~~~~~~~~~~~~
Makefile:4884: recipe for target 'modules/filesystem/physfs/Filesystem.lo' failed

Haven’t checked yet without that part.

sounds like some includes are missing

#include <Application.h> is included in the cpp file, related patch for that part:

diff --git a/src/modules/filesystem/Filesystem.cpp b/src/modules/filesystem/Filesystem.cpp
index 395c87e..10fd759 100644
--- a/src/modules/filesystem/Filesystem.cpp
+++ b/src/modules/filesystem/Filesystem.cpp
@@ -33,6 +33,8 @@
 #elif defined(LOVE_WINDOWS)
 #include <windows.h>
 #include "common/utf8.h"
+#elif defined(LOVE_HAIKU)
+#include <Application.h>
 #elif defined(LOVE_LINUX)
 #include <unistd.h>
 #endif
@@ -105,6 +107,14 @@ std::string Filesystem::getExecutablePath() const
 
 	return to_utf8(buffer);
 
+#elif defined(LOVE_HAIKU)
+	app_info info;
+	if (be_app->GetAppInfo(&info) != B_OK)
+		return "";
+
+	BPath entry(&info.ref);
+	return entry.Path();
+
 #elif defined(LOVE_LINUX)
 
 	char buffer[2048] = {0};

@nephele pushed what I have atm to: love, bump version · 81da14a05a - Begasus/haikuports - Codeberg.org

EDIT: modules/filesystem/physfs/Filesystem.cpp:563:32: error: ‘B_USER_DATA_DIRECTORY’ was not declared in this scope; did you mean ‘B_IS_A_DIRECTORY’?

Fixed with missing: #include <FindDirectory.h>

EDIT2 : nope :stuck_out_tongue:

modules/filesystem/physfs/Filesystem.cpp: In member function 'virtual std::string love::filesystem::physfs::Filesystem::getAppdataDirectory()':
modules/filesystem/physfs/Filesystem.cpp:567:31: error: no matching function for call to 'find_directory(directory_which, std::string*)'
  567 |                 find_directory(B_USER_DATA_DIRECTORY, &appdata);
      |                 ~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

probably the problem is with std::string.

Do expect it to be somewhat broken, I‘d not finished it again since hp destroyed the patchset severall times and I was too frustrated to finish it :smiley:

No problem, already nuked some things out to see what I can keep in there to see if it behaves different between builds. :slight_smile:

No changes, I’ll see to update the existing one at haikuports (github) to bump the version, I’ll keep your patch at codeberg @nephele in case you want to dive back in. :slight_smile:
Checked some downloaded games that work fine, some require an older version, so maybe revive the old(er) one(s) with changed cmd name?