summaryrefslogtreecommitdiff
path: root/Ports/lite-xl/patches/0001-Add-SerenityOS-platform-support.patch
diff options
context:
space:
mode:
Diffstat (limited to 'Ports/lite-xl/patches/0001-Add-SerenityOS-platform-support.patch')
-rw-r--r--Ports/lite-xl/patches/0001-Add-SerenityOS-platform-support.patch192
1 files changed, 192 insertions, 0 deletions
diff --git a/Ports/lite-xl/patches/0001-Add-SerenityOS-platform-support.patch b/Ports/lite-xl/patches/0001-Add-SerenityOS-platform-support.patch
new file mode 100644
index 0000000000..694fd889c9
--- /dev/null
+++ b/Ports/lite-xl/patches/0001-Add-SerenityOS-platform-support.patch
@@ -0,0 +1,192 @@
+From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
+From: Jan200101 <sentrycraft123@gmail.com>
+Date: Mon, 24 Oct 2022 19:23:31 +0200
+Subject: [PATCH] Add SerenityOS platform support
+
+Signed-off-by: Jan200101 <sentrycraft123@gmail.com>
+---
+ meson.build | 3 +-
+ src/api/dirmonitor/inodewatcher.cpp | 75 +++++++++++++++++++++++++++++
+ src/main.c | 7 ++-
+ src/meson.build | 16 +++---
+ 4 files changed, 92 insertions(+), 9 deletions(-)
+ create mode 100644 src/api/dirmonitor/inodewatcher.cpp
+
+diff --git a/meson.build b/meson.build
+index adb7ceb..963bd17 100644
+--- a/meson.build
++++ b/meson.build
+@@ -1,10 +1,11 @@
+ project('lite-xl',
+- ['c'],
++ ['c', 'cpp'],
+ version : '2.1.0',
+ license : 'MIT',
+ meson_version : '>= 0.47',
+ default_options : [
+ 'c_std=gnu11',
++ 'cpp_std=c++20',
+ 'wrap_mode=nofallback'
+ ]
+ )
+diff --git a/src/api/dirmonitor/inodewatcher.cpp b/src/api/dirmonitor/inodewatcher.cpp
+new file mode 100644
+index 0000000..e749f5b
+--- /dev/null
++++ b/src/api/dirmonitor/inodewatcher.cpp
+@@ -0,0 +1,75 @@
++#include <AK/NumericLimits.h>
++#include <Kernel/API/InodeWatcherEvent.h>
++#include <Kernel/API/InodeWatcherFlags.h>
++#include <cstring>
++#include <stdlib.h>
++#include <unistd.h>
++#include <fcntl.h>
++#include <poll.h>
++
++extern "C" {
++struct dirmonitor_internal* init_dirmonitor();
++void deinit_dirmonitor(struct dirmonitor_internal*);
++int get_changes_dirmonitor(struct dirmonitor_internal*, char*, int);
++int translate_changes_dirmonitor(struct dirmonitor_internal*, char*, int, int (*)(int, const char*, void*), void*);
++int add_dirmonitor(struct dirmonitor_internal*, const char*);
++void remove_dirmonitor(struct dirmonitor_internal*, int);
++int get_mode_dirmonitor();
++}
++
++struct dirmonitor_internal {
++ int fd;
++ // a pipe is used to wake the thread in case of exit
++ int sig[2];
++};
++
++
++struct dirmonitor_internal* init_dirmonitor() {
++ struct dirmonitor_internal* monitor = (struct dirmonitor_internal*)calloc(sizeof(struct dirmonitor_internal), 1);
++ monitor->fd = create_inode_watcher(0);
++ pipe(monitor->sig);
++ fcntl(monitor->sig[0], F_SETFD, FD_CLOEXEC);
++ fcntl(monitor->sig[1], F_SETFD, FD_CLOEXEC);
++ return monitor;
++}
++
++
++void deinit_dirmonitor(struct dirmonitor_internal* monitor) {
++ close(monitor->fd);
++ close(monitor->sig[0]);
++ close(monitor->sig[1]);
++}
++
++
++
++int get_changes_dirmonitor(struct dirmonitor_internal* monitor, char* buffer, int length) {
++ struct pollfd fds[2] = { { .fd = monitor->fd, .events = POLLIN | POLLERR, .revents = 0 }, { .fd = monitor->sig[0], .events = POLLIN | POLLERR, .revents = 0 } };
++ poll(fds, 2, -1);
++ return read(monitor->fd, buffer, length);
++}
++
++
++int translate_changes_dirmonitor(struct dirmonitor_internal* monitor, char* buffer, int length, int (*change_callback)(int, const char*, void*), void* data) {
++ InodeWatcherEvent* event = (InodeWatcherEvent*)buffer;
++ change_callback(event->watch_descriptor, NULL, data);
++ return 0;
++}
++
++
++int add_dirmonitor(struct dirmonitor_internal* monitor, const char* path) {
++ return inode_watcher_add_watch(monitor->fd, path, strlen(path),
++ static_cast<unsigned>(
++ InodeWatcherEvent::Type::MetadataModified |
++ InodeWatcherEvent::Type::ContentModified |
++ InodeWatcherEvent::Type::Deleted |
++ InodeWatcherEvent::Type::ChildCreated |
++ InodeWatcherEvent::Type::ChildDeleted
++ ));
++}
++
++
++void remove_dirmonitor(struct dirmonitor_internal* monitor, int fd) {
++ inode_watcher_remove_watch(monitor->fd, fd);
++}
++
++int get_mode_dirmonitor() { return 2; }
+diff --git a/src/main.c b/src/main.c
+index 9784c0a..232b9a9 100644
+--- a/src/main.c
++++ b/src/main.c
+@@ -7,7 +7,7 @@
+
+ #ifdef _WIN32
+ #include <windows.h>
+-#elif __linux__ || __FreeBSD__
++#elif __linux__ || __FreeBSD__ || __serenity__
+ #include <unistd.h>
+ #include <signal.h>
+ #elif __APPLE__
+@@ -31,7 +31,7 @@ static void get_exe_filename(char *buf, int sz) {
+ #if _WIN32
+ int len = GetModuleFileName(NULL, buf, sz - 1);
+ buf[len] = '\0';
+-#elif __linux__
++#elif __linux__ || __serenity__
+ char path[] = "/proc/self/exe";
+ int len = readlink(path, buf, sz - 1);
+ buf[len] = '\0';
+@@ -101,6 +101,9 @@ void set_macos_bundle_resources(lua_State *L);
+ #define ARCH_PLATFORM "freebsd"
+ #elif __APPLE__
+ #define ARCH_PLATFORM "darwin"
++ #elif __serenity__
++ #define ARCH_PLATFORM "serenity"
++ #else
+ #endif
+
+ #if !defined(ARCH_PROCESSOR) || !defined(ARCH_PLATFORM)
+diff --git a/src/meson.build b/src/meson.build
+index 06bb397..8dd25c4 100644
+--- a/src/meson.build
++++ b/src/meson.build
+@@ -11,20 +11,30 @@ lite_sources = [
+ 'main.c',
+ ]
+
++lite_sources += 'api/dirmonitor.c'
+ # dirmonitor backend
+ if get_option('dirmonitor_backend') == ''
+ if cc.has_function('inotify_init', prefix : '#include<sys/inotify.h>')
+ dirmonitor_backend = 'inotify'
++ lite_sources += 'api/dirmonitor/inotify.c'
+ elif host_machine.system() == 'darwin' and cc.check_header('CoreServices/CoreServices.h')
+ dirmonitor_backend = 'fsevents'
++ lite_sources += 'api/dirmonitor/fsevents.c'
+ elif cc.has_function('kqueue', prefix : '#include<sys/event.h>')
+ dirmonitor_backend = 'kqueue'
++ lite_sources += 'api/dirmonitor/kqueue.c'
++ elif cc.has_function('create_inode_watcher', prefix : '#include<fcntl.h>')
++ dirmonitor_backend = 'inodewatcher'
++ lite_sources += 'api/dirmonitor/inodewatcher.cpp'
+ elif dependency('libkqueue', required : false).found()
+ dirmonitor_backend = 'kqueue'
++ lite_sources += 'api/dirmonitor/kqueue.c'
+ elif host_machine.system() == 'windows'
+ dirmonitor_backend = 'win32'
++ lite_sources += 'api/dirmonitor/win32.c'
+ else
+ dirmonitor_backend = 'dummy'
++ lite_sources += 'api/dirmonitor/dummy.c'
+ warning('no suitable backend found, defaulting to dummy backend')
+ endif
+ else
+@@ -40,12 +50,6 @@ if dirmonitor_backend == 'kqueue'
+ endif
+ endif
+
+-lite_sources += [
+- 'api/dirmonitor.c',
+- 'api/dirmonitor/' + dirmonitor_backend + '.c',
+-]
+-
+-
+ lite_rc = []
+ if host_machine.system() == 'windows'
+ windows = import('windows')