From 1f7e95308c6aaac655d2cb9948cd50e4fcafbbbd Mon Sep 17 00:00:00 2001
From: Kubat <mael.martin31@gmail.com>
Date: Fri, 5 Feb 2021 17:26:50 +0100
Subject: [PATCH] WIP: Distribute klkt and mkvpropedit inside the lektord
 appimage

- Also set a correct version string
- Prints AppImage env variables if found at launch time
- Try to launch klkt from inside the AppImage if not found outside
---
 Makefile.am       | 35 ++++++++-----------
 Makefile.in       | 26 +++++++--------
 configure         | 85 ++++++++++++++++++++++++++++++++++++++---------
 configure.ac      | 49 ++++++++++++++++-----------
 inc/Makefile.in   |  2 ++
 man/Makefile.in   |  2 ++
 src/Makefile.am   |  6 +---
 src/Makefile.in   | 58 ++++++--------------------------
 src/main/server.c | 61 ++++++++++++++++++++++++----------
 9 files changed, 182 insertions(+), 142 deletions(-)

diff --git a/Makefile.am b/Makefile.am
index 02189bfe..c80cb052 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,18 +1,14 @@
 ACLOCAL_AMFLAGS = -I config/m4
 
-SUBDIRS = man inc src
-
-bin_SCRIPTS = lkt_show_config
-
+SUBDIRS        = man inc src
+bin_SCRIPTS    = lkt_show_config
 noinst_SCRIPTS = utils/scripts/manpage.bash
 CLEANFILES 	   = utils/scripts/manpage.bash
 
 if LKT_APPIMAGE
 # Build appimages, needs for lektor to be installed
-APPIMAGE_DEPS  = appimage-lektord appimage-lkt
-if LKT_KLKT
-APPIMAGE_DEPS += appimage-klkt
-endif
+APPIMAGE_DEPS = appimage-lektord appimage-lkt
+APPDIR        = AppImage/lektord-@LKT_VERSION@
 appimage: $(APPIMAGE_DEPS)
 
 appimage-common: install
@@ -20,13 +16,20 @@ appimage-common: install
 	cp $(top_srcdir)/utils/desktop/lektor.png AppImage/lektor.png
 
 appimage-lektord: install appimage-common
-
-	$(LKT_LINUXDEPLOY) --appdir AppImage/lektord                     \
+	$(LKT_LINUXDEPLOY) --appdir $(APPDIR) --executable @MKVPROPEDIT@
+if LKT_KLKT
+	$(LKT_LINUXDEPLOY) --appdir $(APPDIR)                            \
+		--desktop-file $(top_srcdir)/utils/desktop/klkt.desktop      \
+		--icon-file AppImage/lektor.png                              \
+		--executable $(bindir)/klkt
+	EXTRA_QT_PLUGINS=xcb $(LKT_LINUXDEPLOYQT) --appdir $(APPDIR)
+endif
+	$(LKT_LINUXDEPLOY) --appdir $(APPDIR)                            \
 		--desktop-file $(top_srcdir)/utils/desktop/lektord.desktop   \
 		--icon-file AppImage/lektor.png                              \
 		--executable $(bindir)/lektord
 	cp -rf $(top_srcdir)/utils/licenses AppImage/lektord/usr/share/
-	$(LKT_APPIMAGETOOL) AppImage/lektord
+	$(LKT_APPIMAGETOOL) $(APPDIR)
 
 appimage-lkt: install appimage-common
 	$(LKT_LINUXDEPLOY) --appdir AppImage/lkt                         \
@@ -35,16 +38,6 @@ appimage-lkt: install appimage-common
 		--executable $(bindir)/lkt
 	$(LKT_APPIMAGETOOL) AppImage/lkt
 
-if LKT_KLKT
-appimage-klkt: install appimage-common
-	$(LKT_LINUXDEPLOY) --appdir AppImage/klkt                        \
-		--desktop-file $(top_srcdir)/utils/desktop/klkt.desktop      \
-		--icon-file AppImage/lektor.png                              \
-		--executable $(bindir)/klkt
-	EXTRA_QT_PLUGINS=xcb $(LKT_LINUXDEPLOYQT) --appdir AppImage/klkt
-	cp -rf $(top_srcdir)/utils/licenses AppImage/klkt/usr/share/
-	$(LKT_APPIMAGETOOL) AppImage/klkt
-endif
 clean-local:
 	-rm -rf AppImage
 endif
diff --git a/Makefile.in b/Makefile.in
index 6ed689ff..fdf771ee 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -88,7 +88,6 @@ PRE_UNINSTALL = :
 POST_UNINSTALL = :
 build_triplet = @build@
 host_triplet = @host@
-@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@am__append_1 = appimage-klkt
 subdir = .
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/config/m4/autotroll.m4 \
@@ -305,6 +304,7 @@ LKT_PATH_BUILD = @LKT_PATH_BUILD@
 LKT_PATH_SOURCE = @LKT_PATH_SOURCE@
 LKT_PREFIX_PATH = @LKT_PREFIX_PATH@
 LKT_STATIC_MODULE = @LKT_STATIC_MODULE@
+LKT_VERSION = @LKT_VERSION@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
@@ -312,6 +312,7 @@ MAKEINFO = @MAKEINFO@
 MAN = @MAN@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+MKVPROPEDIT = @MKVPROPEDIT@
 MOC = @MOC@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -415,8 +416,8 @@ noinst_SCRIPTS = utils/scripts/manpage.bash
 CLEANFILES = utils/scripts/manpage.bash
 
 # Build appimages, needs for lektor to be installed
-@LKT_APPIMAGE_TRUE@APPIMAGE_DEPS = appimage-lektord appimage-lkt \
-@LKT_APPIMAGE_TRUE@	$(am__append_1)
+@LKT_APPIMAGE_TRUE@APPIMAGE_DEPS = appimage-lektord appimage-lkt
+@LKT_APPIMAGE_TRUE@APPDIR = AppImage/lektord-@LKT_VERSION@
 all: all-recursive
 
 .SUFFIXES:
@@ -970,13 +971,18 @@ uninstall-am: uninstall-binSCRIPTS
 @LKT_APPIMAGE_TRUE@	cp $(top_srcdir)/utils/desktop/lektor.png AppImage/lektor.png
 
 @LKT_APPIMAGE_TRUE@appimage-lektord: install appimage-common
-
-@LKT_APPIMAGE_TRUE@	$(LKT_LINUXDEPLOY) --appdir AppImage/lektord                     \
+@LKT_APPIMAGE_TRUE@	$(LKT_LINUXDEPLOY) --appdir $(APPDIR) --executable @MKVPROPEDIT@
+@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@	$(LKT_LINUXDEPLOY) --appdir $(APPDIR)                            \
+@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@		--desktop-file $(top_srcdir)/utils/desktop/klkt.desktop      \
+@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@		--icon-file AppImage/lektor.png                              \
+@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@		--executable $(bindir)/klkt
+@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@	EXTRA_QT_PLUGINS=xcb $(LKT_LINUXDEPLOYQT) --appdir $(APPDIR)
+@LKT_APPIMAGE_TRUE@	$(LKT_LINUXDEPLOY) --appdir $(APPDIR)                            \
 @LKT_APPIMAGE_TRUE@		--desktop-file $(top_srcdir)/utils/desktop/lektord.desktop   \
 @LKT_APPIMAGE_TRUE@		--icon-file AppImage/lektor.png                              \
 @LKT_APPIMAGE_TRUE@		--executable $(bindir)/lektord
 @LKT_APPIMAGE_TRUE@	cp -rf $(top_srcdir)/utils/licenses AppImage/lektord/usr/share/
-@LKT_APPIMAGE_TRUE@	$(LKT_APPIMAGETOOL) AppImage/lektord
+@LKT_APPIMAGE_TRUE@	$(LKT_APPIMAGETOOL) $(APPDIR)
 
 @LKT_APPIMAGE_TRUE@appimage-lkt: install appimage-common
 @LKT_APPIMAGE_TRUE@	$(LKT_LINUXDEPLOY) --appdir AppImage/lkt                         \
@@ -985,14 +991,6 @@ uninstall-am: uninstall-binSCRIPTS
 @LKT_APPIMAGE_TRUE@		--executable $(bindir)/lkt
 @LKT_APPIMAGE_TRUE@	$(LKT_APPIMAGETOOL) AppImage/lkt
 
-@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@appimage-klkt: install appimage-common
-@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@	$(LKT_LINUXDEPLOY) --appdir AppImage/klkt                        \
-@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@		--desktop-file $(top_srcdir)/utils/desktop/klkt.desktop      \
-@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@		--icon-file AppImage/lektor.png                              \
-@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@		--executable $(bindir)/klkt
-@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@	EXTRA_QT_PLUGINS=xcb $(LKT_LINUXDEPLOYQT) --appdir AppImage/klkt
-@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@	cp -rf $(top_srcdir)/utils/licenses AppImage/klkt/usr/share/
-@LKT_APPIMAGE_TRUE@@LKT_KLKT_TRUE@	$(LKT_APPIMAGETOOL) AppImage/klkt
 @LKT_APPIMAGE_TRUE@clean-local:
 @LKT_APPIMAGE_TRUE@	-rm -rf AppImage
 
diff --git a/configure b/configure
index d3c9d402..5335546f 100755
--- a/configure
+++ b/configure
@@ -634,6 +634,7 @@ ac_subst_vars='am__EXEEXT_FALSE
 am__EXEEXT_TRUE
 LTLIBOBJS
 LIBOBJS
+LKT_VERSION
 HAVE_CXX17
 LKT_LIB_DIR
 LKT_LIB_LINK
@@ -764,6 +765,7 @@ LKT_PATH_BUILD
 LKT_PATH_SOURCE
 TEST_SQLITE
 TEST_MAKE
+MKVPROPEDIT
 MAN
 XXD
 target_alias
@@ -2681,6 +2683,47 @@ $as_echo "no" >&6; }
 fi
 
 
+# Extract the first word of "mkvpropedit", so it can be a program name with args.
+set dummy mkvpropedit; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_MKVPROPEDIT+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $MKVPROPEDIT in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_MKVPROPEDIT="$MKVPROPEDIT" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_MKVPROPEDIT="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_MKVPROPEDIT" && ac_cv_path_MKVPROPEDIT=":"
+  ;;
+esac
+fi
+MKVPROPEDIT=$ac_cv_path_MKVPROPEDIT
+if test -n "$MKVPROPEDIT"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $MKVPROPEDIT" >&5
+$as_echo "$MKVPROPEDIT" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
 # Extract the first word of "make", so it can be a program name with args.
 set dummy make; ac_word=$2
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
@@ -17290,6 +17333,9 @@ fi
 if test "$MAN"         = ":"; then :
   as_fn_error $? "man is required" "$LINENO" 5
 fi
+if test "$MKVPROPEDIT" = ":"; then :
+  as_fn_error $? "mkvpropedit is required" "$LINENO" 5
+fi
 if test "$TEST_MAKE"   = ":"; then :
   as_fn_error $? "make is required" "$LINENO" 5
 fi
@@ -17297,6 +17343,9 @@ if test "$TEST_SQLITE" = ":"; then :
   as_fn_error $? "sqlite3 is required" "$LINENO" 5
 fi
 
+# Where is mkvpropedit on your system, will be bundled in the appimage
+
+
 if ! test `sqlite3 --version | cut -f1 -d'.'` = 3 || \
        ! test `sqlite3 --version | cut -f2 -d'.'` -ge 30; then :
   as_fn_error $? "sqlite in version >= 3.30 is needed" "$LINENO" 5
@@ -19504,10 +19553,29 @@ if test $? -ne 0 ; then
     as_fn_error $? "Faield to get sqlite3 with pkg-config, is dev lib for sqlite3 installed?" "$LINENO" 5
 fi
 
+################
+# CONF RESULTS #
+################
+
+cd $LKT_PATH_SOURCE
+
+# TODO: Find another way of doing it, with some integration in lkt. The
+# problem is that this is script is only generated at configuration time and
+# that must of the information is known at build time / is changed between
+# different builds.
+AFF_BUILTINS=`ls -d1 depends/*/ | cut -d'/' -f2`
+AFF_BUILTINS=`echo $AFF_BUILTINS`
+AFF_LASTTAG=`git describe --abbrev=0 --tags 2>/dev/null`
+AFF_BRANCH=`git rev-parse --abbrev-ref HEAD`
+AFF_VERSION=`git -C $LKT_PATH_SOURCE rev-list --count HEAD`.`git -C $LKT_PATH_SOURCE rev-parse --short HEAD`
+LKT_VERSION="$AFF_BRANCH-mk7.$AFF_VERSION"
+
+
 ##########
 # OUTPUT #
 ##########
 
+cd $LKT_PATH_BUILD
 ac_config_headers="$ac_config_headers inc/lektor/lktconfig.h"
 
 ac_config_files="$ac_config_files Makefile inc/Makefile src/Makefile man/Makefile"
@@ -22088,22 +22156,6 @@ $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;}
 fi
 
 
-################
-# CONF RESULTS #
-################
-
-cd $LKT_PATH_SOURCE
-
-# TODO: Find another way of doing it, with some integration in lkt. The
-# problem is that this is script is only generated at configuration time and
-# that must of the information is known at build time / is changed between
-# different builds.
-AFF_BUILTINS=`ls -d1 depends/*/ | cut -d'/' -f2`
-AFF_BUILTINS=`echo $AFF_BUILTINS`
-AFF_LASTTAG=`git describe --abbrev=0 --tags 2>/dev/null`
-AFF_BRANCH=`git rev-parse --abbrev-ref HEAD`
-AFF_VERSION=`git -C $LKT_PATH_SOURCE rev-list --count HEAD`.`git -C $LKT_PATH_SOURCE rev-parse --short HEAD`
-cd $LKT_PATH_BUILD
 LKT_CONFIG_RESULT="
 ########## Lektor configuration ###########
 #
@@ -22140,6 +22192,7 @@ LKT_CONFIG_RESULT="
 #
 # AppImage configured...... $(test x$LKT_APPIMAGE == 'xyes' && echo 'yes' || echo 'no')
 # Patchelf................. $PATCHELF
+# MkvPropedit.............. $MKVPROPEDIT
 # LinuxDeploy.............. $LKT_LINUXDEPLOY
 # AppImageTool............. $LKT_APPIMAGETOOL
 #
diff --git a/configure.ac b/configure.ac
index d7133fc1..ccdbea6e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -9,10 +9,11 @@ AC_PREFIX_DEFAULT(/usr/local)
 # CHECKS #
 ##########
 
-AC_PATH_PROG([XXD],         [xxd],      [:])
-AC_PATH_PROG([MAN],         [man],      [:])
-AC_PATH_PROG([TEST_MAKE],   [make],     [:])
-AC_PATH_PROG([TEST_SQLITE], [sqlite3],  [:])
+AC_PATH_PROG([XXD],         [xxd],          [:])
+AC_PATH_PROG([MAN],         [man],          [:])
+AC_PATH_PROG([MKVPROPEDIT], [mkvpropedit],  [:])
+AC_PATH_PROG([TEST_MAKE],   [make],         [:])
+AC_PATH_PROG([TEST_SQLITE], [sqlite3],      [:])
 
 LKT_PATH_SOURCE="$(dirname $(readlink -f "$0"))"
 LKT_PATH_BUILD="$(pwd)"
@@ -69,10 +70,14 @@ AC_PROG_CC
 AC_PROG_INSTALL
 AC_PROG_CXX
 
-AS_IF([test "$XXD"         = ":"],      [AC_MSG_ERROR([xxd is required])    ])
-AS_IF([test "$MAN"         = ":"],      [AC_MSG_ERROR([man is required])    ])
-AS_IF([test "$TEST_MAKE"   = ":"],      [AC_MSG_ERROR([make is required])   ])
-AS_IF([test "$TEST_SQLITE" = ":"],      [AC_MSG_ERROR([sqlite3 is required])])
+AS_IF([test "$XXD"         = ":"],      [AC_MSG_ERROR([xxd is required])            ])
+AS_IF([test "$MAN"         = ":"],      [AC_MSG_ERROR([man is required])            ])
+AS_IF([test "$MKVPROPEDIT" = ":"],      [AC_MSG_ERROR([mkvpropedit is required])    ])
+AS_IF([test "$TEST_MAKE"   = ":"],      [AC_MSG_ERROR([make is required])           ])
+AS_IF([test "$TEST_SQLITE" = ":"],      [AC_MSG_ERROR([sqlite3 is required])        ])
+
+# Where is mkvpropedit on your system, will be bundled in the appimage
+AC_SUBST([MKVPROPEDIT])
 
 AS_IF([! test `sqlite3 --version | cut -f1 -d'.'` = 3 || \
        ! test `sqlite3 --version | cut -f2 -d'.'` -ge 30],
@@ -324,18 +329,6 @@ if test $? -ne 0 ; then
     AC_MSG_ERROR([Faield to get sqlite3 with pkg-config, is dev lib for sqlite3 installed?])
 fi
 
-##########
-# OUTPUT #
-##########
-
-AC_CONFIG_HEADERS([inc/lektor/lktconfig.h])
-AC_OUTPUT([
-    Makefile
-    inc/Makefile
-    src/Makefile
-    man/Makefile
-])
-
 ################
 # CONF RESULTS #
 ################
@@ -351,7 +344,22 @@ AFF_BUILTINS=`echo $AFF_BUILTINS`
 AFF_LASTTAG=`git describe --abbrev=0 --tags 2>/dev/null`
 AFF_BRANCH=`git rev-parse --abbrev-ref HEAD`
 AFF_VERSION=`git -C $LKT_PATH_SOURCE rev-list --count HEAD`.`git -C $LKT_PATH_SOURCE rev-parse --short HEAD`
+LKT_VERSION="$AFF_BRANCH-mk7.$AFF_VERSION"
+AC_SUBST([LKT_VERSION])
+
+##########
+# OUTPUT #
+##########
+
 cd $LKT_PATH_BUILD
+AC_CONFIG_HEADERS([inc/lektor/lktconfig.h])
+AC_OUTPUT([
+    Makefile
+    inc/Makefile
+    src/Makefile
+    man/Makefile
+])
+
 LKT_CONFIG_RESULT="
 ########## Lektor configuration ###########
 #
@@ -388,6 +396,7 @@ LKT_CONFIG_RESULT="
 #
 # AppImage configured...... $(test x$LKT_APPIMAGE == 'xyes' && echo 'yes' || echo 'no')
 # Patchelf................. $PATCHELF
+# MkvPropedit.............. $MKVPROPEDIT
 # LinuxDeploy.............. $LKT_LINUXDEPLOY
 # AppImageTool............. $LKT_APPIMAGETOOL
 #
diff --git a/inc/Makefile.in b/inc/Makefile.in
index 7e75d8ff..7d85c520 100644
--- a/inc/Makefile.in
+++ b/inc/Makefile.in
@@ -235,6 +235,7 @@ LKT_PATH_BUILD = @LKT_PATH_BUILD@
 LKT_PATH_SOURCE = @LKT_PATH_SOURCE@
 LKT_PREFIX_PATH = @LKT_PREFIX_PATH@
 LKT_STATIC_MODULE = @LKT_STATIC_MODULE@
+LKT_VERSION = @LKT_VERSION@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
@@ -242,6 +243,7 @@ MAKEINFO = @MAKEINFO@
 MAN = @MAN@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+MKVPROPEDIT = @MKVPROPEDIT@
 MOC = @MOC@
 NM = @NM@
 NMEDIT = @NMEDIT@
diff --git a/man/Makefile.in b/man/Makefile.in
index d592c364..db5208b7 100644
--- a/man/Makefile.in
+++ b/man/Makefile.in
@@ -217,6 +217,7 @@ LKT_PATH_BUILD = @LKT_PATH_BUILD@
 LKT_PATH_SOURCE = @LKT_PATH_SOURCE@
 LKT_PREFIX_PATH = @LKT_PREFIX_PATH@
 LKT_STATIC_MODULE = @LKT_STATIC_MODULE@
+LKT_VERSION = @LKT_VERSION@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
@@ -224,6 +225,7 @@ MAKEINFO = @MAKEINFO@
 MAN = $(abs_top_srcdir)/utils/scripts/manpage.bash
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+MKVPROPEDIT = @MKVPROPEDIT@
 MOC = @MOC@
 NM = @NM@
 NMEDIT = @NMEDIT@
diff --git a/src/Makefile.am b/src/Makefile.am
index 59e7f840..6d4b9724 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -84,11 +84,7 @@ EXTRA_DIST = database/disk.sql database/memory.sql
 ## MAIN FILES ##
 ################
 
-bin_PROGRAMS = lektord lkt mkv_test
-
-## Test program for the new mkv writes
-mkv_test_SOURCES = main/mkv_test.c base/common.c base/segv.c mkv/mkv.c mkv/utils.c mkv/write.c base/bufferfd.c
-mkv_test_LDFLAGS = -pthread -ldl -static
+bin_PROGRAMS = lektord lkt
 
 ## The lkt client
 lkt_SOURCES = main/lkt.c base/cmd.c base/common.c base/segv.c
diff --git a/src/Makefile.in b/src/Makefile.in
index e7980a23..adc6594e 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -134,8 +134,7 @@ host_triplet = @host@
 
 # TODO pour le Kubat du futur: c'est pas beau, trouver un truc pour que ça se fasse tout seul
 @LKT_STATIC_MODULE_TRUE@am__append_8 = module/thread.c
-bin_PROGRAMS = lektord$(EXEEXT) lkt$(EXEEXT) mkv_test$(EXEEXT) \
-	$(am__EXEEXT_1)
+bin_PROGRAMS = lektord$(EXEEXT) lkt$(EXEEXT) $(am__EXEEXT_1)
 @LKT_KLKT_TRUE@am__append_9 = klkt/klkt
 @LKT_KLKT_TRUE@am__append_10 = $(BUILT_SOURCES)
 @LKT_KLKT_TRUE@am__append_11 = $(BUILT_SOURCES)
@@ -271,14 +270,6 @@ lkt_LDADD = $(LDADD)
 lkt_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
 	$(lkt_LDFLAGS) $(LDFLAGS) -o $@
-am_mkv_test_OBJECTS = main/mkv_test.$(OBJEXT) base/common.$(OBJEXT) \
-	base/segv.$(OBJEXT) mkv/mkv.$(OBJEXT) mkv/utils.$(OBJEXT) \
-	mkv/write.$(OBJEXT) base/bufferfd.$(OBJEXT)
-mkv_test_OBJECTS = $(am_mkv_test_OBJECTS)
-mkv_test_LDADD = $(LDADD)
-mkv_test_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(mkv_test_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -294,8 +285,7 @@ am__v_at_1 =
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)/inc/lektor
 depcomp = $(SHELL) $(top_srcdir)/config/depcomp
 am__maybe_remake_depfiles = depfiles
-am__depfiles_remade = base/$(DEPDIR)/bufferfd.Po base/$(DEPDIR)/cmd.Po \
-	base/$(DEPDIR)/common.Po \
+am__depfiles_remade = base/$(DEPDIR)/cmd.Po base/$(DEPDIR)/common.Po \
 	base/$(DEPDIR)/liblektor_la-bufferfd.Plo \
 	base/$(DEPDIR)/liblektor_la-cmd.Plo \
 	base/$(DEPDIR)/liblektor_la-commands.Plo \
@@ -318,11 +308,9 @@ am__depfiles_remade = base/$(DEPDIR)/bufferfd.Po base/$(DEPDIR)/cmd.Po \
 	database/$(DEPDIR)/liblektor_la-user.Plo \
 	klkt/$(DEPDIR)/klkt-icons.qrc.Po klkt/$(DEPDIR)/klkt-klkt.Po \
 	klkt/$(DEPDIR)/klkt-klkt.moc.Po main/$(DEPDIR)/lkt.Po \
-	main/$(DEPDIR)/mkv_test.Po main/$(DEPDIR)/server.Po \
-	mkv/$(DEPDIR)/liblektor_la-mkv.Plo \
+	main/$(DEPDIR)/server.Po mkv/$(DEPDIR)/liblektor_la-mkv.Plo \
 	mkv/$(DEPDIR)/liblektor_la-utils.Plo \
-	mkv/$(DEPDIR)/liblektor_la-write.Plo mkv/$(DEPDIR)/mkv.Po \
-	mkv/$(DEPDIR)/utils.Po mkv/$(DEPDIR)/write.Po \
+	mkv/$(DEPDIR)/liblektor_la-write.Plo \
 	module/$(DEPDIR)/liblektor_la-thread.Plo \
 	module/$(DEPDIR)/liblktmodrepo_la-module_repo.Plo \
 	module/$(DEPDIR)/liblktmodrepo_la-worker.Plo \
@@ -370,11 +358,11 @@ am__v_CXXLD_0 = @echo "  CXXLD   " $@;
 am__v_CXXLD_1 = 
 SOURCES = $(liblektor_la_SOURCES) $(liblktmodrepo_la_SOURCES) \
 	$(liblktmodsdl_la_SOURCES) $(klkt_klkt_SOURCES) \
-	$(lektord_SOURCES) $(lkt_SOURCES) $(mkv_test_SOURCES)
+	$(lektord_SOURCES) $(lkt_SOURCES)
 DIST_SOURCES = $(am__liblektor_la_SOURCES_DIST) \
 	$(liblktmodrepo_la_SOURCES) $(liblktmodsdl_la_SOURCES) \
 	$(am__klkt_klkt_SOURCES_DIST) $(lektord_SOURCES) \
-	$(lkt_SOURCES) $(mkv_test_SOURCES)
+	$(lkt_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -461,6 +449,7 @@ LKT_PATH_BUILD = @LKT_PATH_BUILD@
 LKT_PATH_SOURCE = @LKT_PATH_SOURCE@
 LKT_PREFIX_PATH = @LKT_PREFIX_PATH@
 LKT_STATIC_MODULE = @LKT_STATIC_MODULE@
+LKT_VERSION = @LKT_VERSION@
 LN_S = @LN_S@
 LTLIBOBJS = @LTLIBOBJS@
 LT_SYS_LIBRARY_PATH = @LT_SYS_LIBRARY_PATH@
@@ -468,6 +457,7 @@ MAKEINFO = @MAKEINFO@
 MAN = @MAN@
 MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
+MKVPROPEDIT = @MKVPROPEDIT@
 MOC = @MOC@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -604,8 +594,6 @@ liblektor_la_LDFLAGS = -avoid-version -pthread -lsqlite3 -ldl \
 @LKT_STATIC_MODULE_TRUE@liblektor_la_LIBADD = liblktmodsdl.la liblktmodrepo.la
 CLEANFILES = database/disk.c database/memory.c $(am__append_11)
 EXTRA_DIST = database/disk.sql database/memory.sql $(am__append_10)
-mkv_test_SOURCES = main/mkv_test.c base/common.c base/segv.c mkv/mkv.c mkv/utils.c mkv/write.c base/bufferfd.c
-mkv_test_LDFLAGS = -pthread -ldl -static
 lkt_SOURCES = main/lkt.c base/cmd.c base/common.c base/segv.c
 lkt_LDFLAGS = -pthread -ldl -static
 lektord_SOURCES = main/server.c
@@ -913,17 +901,6 @@ base/segv.$(OBJEXT): base/$(am__dirstamp) \
 lkt$(EXEEXT): $(lkt_OBJECTS) $(lkt_DEPENDENCIES) $(EXTRA_lkt_DEPENDENCIES) 
 	@rm -f lkt$(EXEEXT)
 	$(AM_V_CCLD)$(lkt_LINK) $(lkt_OBJECTS) $(lkt_LDADD) $(LIBS)
-main/mkv_test.$(OBJEXT): main/$(am__dirstamp) \
-	main/$(DEPDIR)/$(am__dirstamp)
-mkv/mkv.$(OBJEXT): mkv/$(am__dirstamp) mkv/$(DEPDIR)/$(am__dirstamp)
-mkv/utils.$(OBJEXT): mkv/$(am__dirstamp) mkv/$(DEPDIR)/$(am__dirstamp)
-mkv/write.$(OBJEXT): mkv/$(am__dirstamp) mkv/$(DEPDIR)/$(am__dirstamp)
-base/bufferfd.$(OBJEXT): base/$(am__dirstamp) \
-	base/$(DEPDIR)/$(am__dirstamp)
-
-mkv_test$(EXEEXT): $(mkv_test_OBJECTS) $(mkv_test_DEPENDENCIES) $(EXTRA_mkv_test_DEPENDENCIES) 
-	@rm -f mkv_test$(EXEEXT)
-	$(AM_V_CCLD)$(mkv_test_LINK) $(mkv_test_OBJECTS) $(mkv_test_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -943,7 +920,6 @@ mostlyclean-compile:
 distclean-compile:
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/bufferfd.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/cmd.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/common.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@base/$(DEPDIR)/liblektor_la-bufferfd.Plo@am__quote@ # am--include-marker
@@ -971,14 +947,10 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@klkt/$(DEPDIR)/klkt-klkt.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@klkt/$(DEPDIR)/klkt-klkt.moc.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@main/$(DEPDIR)/lkt.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@main/$(DEPDIR)/mkv_test.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@main/$(DEPDIR)/server.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@mkv/$(DEPDIR)/liblektor_la-mkv.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@mkv/$(DEPDIR)/liblektor_la-utils.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@mkv/$(DEPDIR)/liblektor_la-write.Plo@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@mkv/$(DEPDIR)/mkv.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@mkv/$(DEPDIR)/utils.Po@am__quote@ # am--include-marker
-@AMDEP_TRUE@@am__include@ @am__quote@mkv/$(DEPDIR)/write.Po@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@module/$(DEPDIR)/liblektor_la-thread.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@module/$(DEPDIR)/liblktmodrepo_la-module_repo.Plo@am__quote@ # am--include-marker
 @AMDEP_TRUE@@am__include@ @am__quote@module/$(DEPDIR)/liblktmodrepo_la-worker.Plo@am__quote@ # am--include-marker
@@ -1462,8 +1434,7 @@ clean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \
 	clean-libtool clean-noinstLTLIBRARIES mostlyclean-am
 
 distclean: distclean-am
-		-rm -f base/$(DEPDIR)/bufferfd.Po
-	-rm -f base/$(DEPDIR)/cmd.Po
+		-rm -f base/$(DEPDIR)/cmd.Po
 	-rm -f base/$(DEPDIR)/common.Po
 	-rm -f base/$(DEPDIR)/liblektor_la-bufferfd.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-cmd.Plo
@@ -1490,14 +1461,10 @@ distclean: distclean-am
 	-rm -f klkt/$(DEPDIR)/klkt-klkt.Po
 	-rm -f klkt/$(DEPDIR)/klkt-klkt.moc.Po
 	-rm -f main/$(DEPDIR)/lkt.Po
-	-rm -f main/$(DEPDIR)/mkv_test.Po
 	-rm -f main/$(DEPDIR)/server.Po
 	-rm -f mkv/$(DEPDIR)/liblektor_la-mkv.Plo
 	-rm -f mkv/$(DEPDIR)/liblektor_la-utils.Plo
 	-rm -f mkv/$(DEPDIR)/liblektor_la-write.Plo
-	-rm -f mkv/$(DEPDIR)/mkv.Po
-	-rm -f mkv/$(DEPDIR)/utils.Po
-	-rm -f mkv/$(DEPDIR)/write.Po
 	-rm -f module/$(DEPDIR)/liblektor_la-thread.Plo
 	-rm -f module/$(DEPDIR)/liblktmodrepo_la-module_repo.Plo
 	-rm -f module/$(DEPDIR)/liblktmodrepo_la-worker.Plo
@@ -1551,8 +1518,7 @@ install-ps-am:
 installcheck-am: installcheck-binPROGRAMS
 
 maintainer-clean: maintainer-clean-am
-		-rm -f base/$(DEPDIR)/bufferfd.Po
-	-rm -f base/$(DEPDIR)/cmd.Po
+		-rm -f base/$(DEPDIR)/cmd.Po
 	-rm -f base/$(DEPDIR)/common.Po
 	-rm -f base/$(DEPDIR)/liblektor_la-bufferfd.Plo
 	-rm -f base/$(DEPDIR)/liblektor_la-cmd.Plo
@@ -1579,14 +1545,10 @@ maintainer-clean: maintainer-clean-am
 	-rm -f klkt/$(DEPDIR)/klkt-klkt.Po
 	-rm -f klkt/$(DEPDIR)/klkt-klkt.moc.Po
 	-rm -f main/$(DEPDIR)/lkt.Po
-	-rm -f main/$(DEPDIR)/mkv_test.Po
 	-rm -f main/$(DEPDIR)/server.Po
 	-rm -f mkv/$(DEPDIR)/liblektor_la-mkv.Plo
 	-rm -f mkv/$(DEPDIR)/liblektor_la-utils.Plo
 	-rm -f mkv/$(DEPDIR)/liblektor_la-write.Plo
-	-rm -f mkv/$(DEPDIR)/mkv.Po
-	-rm -f mkv/$(DEPDIR)/utils.Po
-	-rm -f mkv/$(DEPDIR)/write.Po
 	-rm -f module/$(DEPDIR)/liblektor_la-thread.Plo
 	-rm -f module/$(DEPDIR)/liblktmodrepo_la-module_repo.Plo
 	-rm -f module/$(DEPDIR)/liblktmodrepo_la-worker.Plo
diff --git a/src/main/server.c b/src/main/server.c
index e472659d..2223ad06 100644
--- a/src/main/server.c
+++ b/src/main/server.c
@@ -61,10 +61,10 @@ __attribute__((destructor))
 static void ___tty_enable_echo(void)
 {
     if (tcsetattr(STDIN_FILENO, TCSANOW, &___tty_save) == -1)
-        LOG_ERROR("GENERAL", "Failed to reset termios flags");
+        LOG_ERROR("INIT", "Failed to reset termios flags");
     errno = 0;
     if (fflush(stdin) != 0)
-        LOG_ERROR("GENERAL", "Failed to flush stdin: %s", strerror(errno));
+        LOG_ERROR("INIT", "Failed to flush stdin: %s", strerror(errno));
 }
 
 /* Recursive mkdir, where the last word of the string is a file, not a folder. */
@@ -100,16 +100,16 @@ ___kill_klkt(void)
 
     if (kill(___klkt_pid, SIGTERM) != 0) {
         kill(___klkt_pid, SIGKILL);
-        LOG_ERROR("GENERAL", "Failed to SIGTERM klkt with pid %ld, SIGKILL it", ___klkt_pid);
+        LOG_ERROR("INIT", "Failed to SIGTERM klkt with pid %ld, SIGKILL it", ___klkt_pid);
         return;
     }
 
     int status;
     do {
         if (waitpid(___klkt_pid, &status, WUNTRACED | WCONTINUED) == -1)
-            LOG_ERROR("GENERAL", "Failed to wait for child klkt with pid %ld", ___klkt_pid);
+            LOG_ERROR("INIT", "Failed to wait for child klkt with pid %ld", ___klkt_pid);
 
-        LOG_INFO("GENERAL", "Child klkt status is %s%d",
+        LOG_INFO("INIT", "Child klkt status is %s%d",
                  /* String desc */
                  WIFEXITED(status)   ? "exited with status " :
                  WIFSIGNALED(status) ? "killed by signal "   :
@@ -128,11 +128,11 @@ launch_klkt(va_list UNUSED *___args)
     /* Check env variable! */
     char *env_klkt_pid = getenv(LKT_ENV_KLKT_PID);
     if (NULL != env_klkt_pid) {
-        LOG_DEBUG("GENERAL", "Found " LKT_ENV_KLKT_PID " := %s", env_klkt_pid);
+        LOG_DEBUG("INIT", "Found " LKT_ENV_KLKT_PID " := %s", env_klkt_pid);
         ___klkt_pid = strtol(env_klkt_pid, NULL, 0);
         return 0;
     }
-    LOG_DEBUG("GENERAL", "No " LKT_ENV_KLKT_PID " env variable found, launch klkt ourself");
+    LOG_DEBUG("INIT", "No " LKT_ENV_KLKT_PID " env variable found, launch klkt ourself");
 
     /* Env var was not found, no existing lklt! Launch it ourself. */
     char exe_path[LKT_LINE_MAX];
@@ -147,16 +147,20 @@ launch_klkt(va_list UNUSED *___args)
     posix_spawn_file_actions_addopen(&action, STDOUT_FILENO, "/dev/null", O_RDONLY, 0);
     posix_spawn_file_actions_addopen(&action, STDERR_FILENO, "/dev/null", O_RDONLY, 0);
 
+    bool appimage_once_goto = false;
+
     if (appimage == NULL) {
         /* No AppImage */
+retry_without_appimage:
+        appimage_once_goto = true;
         if (read_self_exe(exe_path, LKT_LINE_MAX)) {
-            LOG_ERROR("GENERAL", "Failed to get the current executable path, not patching the PATH");
+            LOG_ERROR("INIT", "Failed to get the current executable path, not patching the PATH");
             goto error;
         }
     } else {
         /* AppImage */
         safe_strncpy(exe_path, appimage, LKT_LINE_MAX);
-        LOG_DEBUG("GENERAL", "Running an AppImage, file is %s", appimage);
+        LOG_DEBUG("INIT", "Running an AppImage, file is %s", appimage);
     }
 
     char *current_dir = dirname(exe_path);
@@ -164,7 +168,7 @@ launch_klkt(va_list UNUSED *___args)
     /* Normal try */
     errno = 0;
     safe_snprintf(try_name, LKT_LINE_MAX, "%s/klkt", current_dir);
-    LOG_DEBUG("GENERAL", "Try to launch klkt with file %s", try_name);
+    LOG_DEBUG("INIT", "Try to launch klkt with file %s", try_name);
     GOTO_UNLESS(posix_spawn(&___klkt_pid, try_name, &action, NULL, args, environ),
                 "Klkt launched!", end);
 
@@ -172,25 +176,31 @@ launch_klkt(va_list UNUSED *___args)
     safe_snprintf(try_name, LKT_LINE_MAX, "%s/klkt-" LKT_ARCH ".AppImage", current_dir);
     errno   = 0;
     args[0] = (char *) basename_appimage_arch;
-    LOG_DEBUG("GENERAL", "Try to launch klkt with file %s", try_name);
+    LOG_DEBUG("INIT", "Try to launch klkt with file %s", try_name);
     GOTO_UNLESS(posix_spawn(&___klkt_pid, try_name, &action, NULL, args, environ),
                 "Klkt launched!", end);
 
     safe_snprintf(try_name, LKT_LINE_MAX, "%s/klkt.AppImage", current_dir);
     errno   = 0;
     args[0] = (char *) basename_appimage_no_arch;
-    LOG_DEBUG("GENERAL", "Try to launch klkt with file %s", try_name);
+    LOG_DEBUG("INIT", "Try to launch klkt with file %s", try_name);
     GOTO_UNLESS(posix_spawn(&___klkt_pid, try_name, &action, NULL, args, environ),
                 "Klkt launched!", end);
 
     /* Oupsi */
 error:
-    LOG_ERROR("GENERAL", "Failed to spawn klkt (%s): %s", try_name, strerror(errno));
+    LOG_ERROR("INIT", "Failed to spawn klkt (%s): %s", try_name, strerror(errno));
     ___klkt_pid = 0; /* posix_spawnp may have modified it even in case of failure */
+
+    /* If we are an AppImage, klkt might be inside the AppImage,
+     * try to launch that executable */
+    GOTO_UNLESS(appimage_once_goto, "Retry to launch klkt, without self executable path patching",
+                retry_without_appimage);
+
     return 1;
 
 end:
-    LOG_INFO("GENERAL", "Klkt launched with pid %ld", ___klkt_pid, try_name);
+    LOG_INFO("INIT", "Klkt launched with pid %ld", ___klkt_pid, try_name);
     posix_spawn_file_actions_destroy(&action);
 
     /* Export the env var for klkt pid, reuse exe_path */
@@ -248,9 +258,24 @@ main(int argc, char *argv[])
 
     reg_export(server_reg);
     if (read_self_exe(exe, PATH_MAX))
-        LOG_WARN("GENERAL", "Failed to read self executable path, "
-                 "restart may not work");
+        LOG_WARN("INIT", "Failed to read self executable path, restart may not work");
     executable_name = exe;
+    LOG_WARN("INIT", "The argv[0] from main is: %s", exe);
+
+    /* Detect AppImage. Those env var names are defined for V2 AppImages, see
+     * https://docs.appimage.org/packaging-guide/environment-variables.html */
+    char *env_APPIMAGE = getenv("APPIMAGE");
+    char *env_APPDIR   = getenv("APPDIR");
+    char *env_OWD      = getenv("OWD");
+    char *env_ARGV0    = getenv("ARGV0");
+    if (env_APPDIR || env_ARGV0 || env_APPIMAGE || env_OWD) {
+        LOG_DEBUG("INIT", "AppImage build detected, here are some usefull env vars");
+        LOG_DEBUG("INIT", "AppImage env APPIMAGE = %s", env_APPIMAGE);
+        LOG_DEBUG("INIT", "AppImage env APPDIR   = %s", env_APPDIR);
+        LOG_DEBUG("INIT", "AppImage env OWD      = %s", env_OWD);
+        LOG_DEBUG("INIT", "AppImage env ARGV0    = %s", env_ARGV0);
+    } else
+        LOG_DEBUG("INIT", "No AppImage env variable found!");
 
     /* Init the server */
     struct lkt_state srv;
@@ -337,7 +362,7 @@ retry_config:
     {   /* Module initialization */
         char *module = safe_malloc(sizeof(char) * PATH_MAX);
         if (!module) {
-            LOG_ERROR("GENERAL", "Out of memory");
+            LOG_ERROR("INIT", "Out of memory");
             return 1;
         }
         database_config_get(srv.db, "player", "module", module, PATH_MAX);
@@ -362,7 +387,7 @@ retry_config:
         }
     }
 
-    LOG_INFO("GENERAL", "Lektor was %s",
+    LOG_INFO("INIT", "Lektor was %s",
              env_get(LKT_ENV_RESTART) ? "restarted" : "started");
 
     config_handle_hook(srv.db, "launched");
-- 
GitLab