From 06bf4d4168f18e4de643d47b6bd619659a8878ca Mon Sep 17 00:00:00 2001 From: Ben Widawsky Date: Mon, 5 Nov 2018 18:07:06 -0800 Subject: [PATCH] x11/kitty: Add the terminal emulator kitty v2: Taken updates from ndowns https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=233010#c1 Fixed terminfo/termcap stuff v3: Update to version 0.13.0 Go back to using tic at install v4: Update to version 0.13.3 Depend on termcap instead of USES=terminfo https://reviews.freebsd.org/D19060 v5: Add Wayland support from myfreeweb - The Wayland autodetect broke anyway somewhere in the 0.13 releases. So it was either patch it out, or make it work. Since myfreeweb had already made it work, just use it. Fix for glfw/wl --- x11/Makefile | 1 + x11/kitty/Makefile | 69 ++++++++++++++ x11/kitty/distinfo | 3 + .../bell-off-patch-kitty_config__data.py | 11 +++ x11/kitty/files/docs-off-patch-setup.py | 37 ++++++++ x11/kitty/files/docs-on-patch-setup.py | 28 ++++++ x11/kitty/files/patch-glfw_memfd.h | 14 +++ x11/kitty/files/patch-glfw_wl__init.c | 11 +++ x11/kitty/files/patch-glfw_wl__window.c | 26 ++++++ x11/kitty/files/patch-kitty_child.c | 22 +++++ x11/kitty/files/patch-kitty_child.py | 19 ++++ x11/kitty/pkg-descr | 20 +++++ x11/kitty/pkg-plist | 90 +++++++++++++++++++ 13 files changed, 351 insertions(+) create mode 100644 x11/kitty/Makefile create mode 100644 x11/kitty/distinfo create mode 100644 x11/kitty/files/bell-off-patch-kitty_config__data.py create mode 100644 x11/kitty/files/docs-off-patch-setup.py create mode 100644 x11/kitty/files/docs-on-patch-setup.py create mode 100644 x11/kitty/files/patch-glfw_memfd.h create mode 100644 x11/kitty/files/patch-glfw_wl__init.c create mode 100644 x11/kitty/files/patch-glfw_wl__window.c create mode 100644 x11/kitty/files/patch-kitty_child.c create mode 100644 x11/kitty/files/patch-kitty_child.py create mode 100644 x11/kitty/pkg-descr create mode 100644 x11/kitty/pkg-plist diff --git a/x11/Makefile b/x11/Makefile index d8e3e2cad0b1..dbb9ded7edbe 100644 --- a/x11/Makefile +++ b/x11/Makefile @@ -129,6 +129,7 @@ SUBDIR += kf5-kwayland SUBDIR += kf5-kwindowsystem SUBDIR += kf5-plasma-framework + SUBDIR += kitty SUBDIR += konsole SUBDIR += leechcraft SUBDIR += lemonbar diff --git a/x11/kitty/Makefile b/x11/kitty/Makefile new file mode 100644 index 000000000000..eb433243b953 --- /dev/null +++ b/x11/kitty/Makefile @@ -0,0 +1,69 @@ +# Created by: Ben Widawsky +# $FreeBSD$ + +PORTNAME= kitty +PORTVERSION= 0.13.3 +DISTVERSIONPREFIX= v +CATEGORIES= x11 + +MAINTAINER= bwidawsk@FreeBSD.org +COMMENT= Cross-platform, fast, feature full, GPU based terminal emulator + +LICENSE= GPLv3 +LICENSE_FILE= ${WRKSRC}/LICENSE + +LIB_DEPENDS= libdbus-1.so:devel/dbus \ + libfontconfig.so:x11-fonts/fontconfig \ + libfreetype.so:print/freetype2 \ + libglfw.so:graphics/glfw \ + libharfbuzz.so:print/harfbuzz \ + libpng.so:graphics/png \ + libxkbcommon.so:x11/libxkbcommon \ + libncursesw.so:devel/ncurses \ + libdbus-1.so:devel/dbus \ + libwayland-egl.so:graphics/wayland \ + libepoll-shim.so:devel/libepoll-shim \ + libpng.so:graphics/png + +USES= gl gmake pkgconfig:build python:3.5+ shebangfix terminfo +USE_GL= gl +USE_XORG= x11 xft xrandr xinerama xcb xcursor +USE_GITHUB= yes +GH_ACCOUNT= kovidgoyal + +SHEBANG_FILES= kitty/launcher/kitty +BINARY_ALIAS= python3=${PYTHON_CMD} + +OPTIONS_DEFINE= ICAT DOCS BELL NLS +OPTIONS_DEFAULT= NLS + +ICAT_DESC= tool to display images in the terminal +ICAT_LIB_DEPENDS= libMagickCore-6.so:graphics/ImageMagick + +DOCS_BUILD_DEPENDS= ${PYTHON_PKGNAMEPREFIX}sphinx>=1.7:textproc/py-sphinx@${PY_FLAVOR} +DOCS_EXTRA_PATCHES= ${PATCHDIR}/docs-on-patch-setup.py +DOCS_EXTRA_PATCHES_OFF= ${PATCHDIR}/docs-off-patch-setup.py + +BELL_DESC= disable audio bell by default (can be changed in kitty.conf) +BELL_EXTRA_PATCHES_OFF= ${PATCHDIR}/bell-off-patch-kitty_config__data.py + +NLS_USES= gettext + +post-patch-DOCS-on: + ${REINPLACE_CMD} -e 's|python3|${PYTHON_CMD}|g' ${WRKSRC}/docs/Makefile + ${REINPLACE_CMD} -e 's|sphinx-build|&-${PYTHON_VER}|' ${WRKSRC}/docs/Makefile + +do-build: + cd ${WRKSRC} && CC=clang ${PYTHON_CMD} setup.py --prefix ${STAGEDIR}${PREFIX} linux-package + +do-install: + @${STRIP_CMD} ${STAGEDIR}${PREFIX}/lib/kitty/kitty/fast_data_types.so \ + ${STAGEDIR}${PREFIX}/lib/kitty/kitty/glfw-x11.so \ + ${STAGEDIR}${PREFIX}/lib/kitty/kittens/diff/diff_speedup.so \ + ${STAGEDIR}${PREFIX}/lib/kitty/kittens/unicode_input/unicode_names.so \ + ${STAGEDIR}${PREFIX}/lib/kitty/kitty/glfw-wayland.so \ + ${STAGEDIR}${PREFIX}/bin/kitty + ${INSTALL_DATA} ${WRKSRC}/terminfo/kitty.terminfo \ + ${STAGEDIR}${PREFIX}/share/misc/ + +.include diff --git a/x11/kitty/distinfo b/x11/kitty/distinfo new file mode 100644 index 000000000000..ec2256da40fa --- /dev/null +++ b/x11/kitty/distinfo @@ -0,0 +1,3 @@ +TIMESTAMP = 1549088378 +SHA256 (kovidgoyal-kitty-v0.13.3_GH0.tar.gz) = b6f48404349ca99049de40e7bb55511de9ea04a6b1567068997d3fddb2c20f08 +SIZE (kovidgoyal-kitty-v0.13.3_GH0.tar.gz) = 3510975 diff --git a/x11/kitty/files/bell-off-patch-kitty_config__data.py b/x11/kitty/files/bell-off-patch-kitty_config__data.py new file mode 100644 index 000000000000..d45f21ff6c20 --- /dev/null +++ b/x11/kitty/files/bell-off-patch-kitty_config__data.py @@ -0,0 +1,11 @@ +--- kitty/config_data.py.orig 2018-11-06 01:20:16 UTC ++++ kitty/config_data.py +@@ -426,7 +426,7 @@ If so, set this to no.''')) + + g('bell') # {{{ + +-o('enable_audio_bell', True, long_text=_(''' ++o('enable_audio_bell', False, long_text=_(''' + Enable/disable the audio bell. Useful in environments that require silence.''')) + + o('visual_bell_duration', 0.0, option_type=positive_float, long_text=_(''' diff --git a/x11/kitty/files/docs-off-patch-setup.py b/x11/kitty/files/docs-off-patch-setup.py new file mode 100644 index 000000000000..9cfb1dbba1e2 --- /dev/null +++ b/x11/kitty/files/docs-off-patch-setup.py @@ -0,0 +1,37 @@ +--- setup.py.orig 2018-12-06 05:19:25 UTC ++++ setup.py +@@ -600,16 +600,6 @@ def package(args, for_bundle=False, sh_launcher=False) + if os.path.exists(libdir): + shutil.rmtree(libdir) + os.makedirs(os.path.join(libdir, 'logo')) +- for x in (libdir, os.path.join(ddir, 'share')): +- odir = os.path.join(x, 'terminfo') +- safe_makedirs(odir) +- proc = subprocess.run(['tic', '-x', '-o' + odir, 'terminfo/kitty.terminfo'], check=True, stderr=subprocess.PIPE) +- regex = '^"terminfo/kitty.terminfo", line [0-9]+, col [0-9]+, terminal \'xterm-kitty\': older tic versions may treat the description field as an alias$' +- for error in proc.stderr.decode('utf-8').splitlines(): +- if not re.match(regex, error): +- print(error, file=sys.stderr) +- if not glob.glob(os.path.join(odir, '*/xterm-kitty')): +- raise SystemExit('tic failed to output the compiled kitty terminfo file') + shutil.copy2('__main__.py', libdir) + shutil.copy2('logo/kitty.rgba', os.path.join(libdir, 'logo')) + shutil.copy2('logo/beam-cursor.png', os.path.join(libdir, 'logo')) +@@ -634,8 +624,6 @@ def package(args, for_bundle=False, sh_launcher=False) + safe_makedirs(launcher_dir) + build_linux_launcher(args, launcher_dir, for_bundle, sh_launcher, args.for_freeze) + if not is_macos: # {{{ linux desktop gunk +- copy_man_pages(ddir) +- copy_html_docs(ddir) + icdir = os.path.join(ddir, 'share', 'icons', 'hicolor', '256x256', 'apps') + safe_makedirs(icdir) + shutil.copy2('logo/kitty.png', icdir) +@@ -822,8 +810,6 @@ def main(): + ) + elif args.action == 'linux-package': + build(args, native_optimizations=False) +- if not os.path.exists(os.path.join(base, 'docs/_build/html')): +- run_tool(['make', 'docs']) + package(args) + elif args.action == 'osx-bundle': + build(args, native_optimizations=False) diff --git a/x11/kitty/files/docs-on-patch-setup.py b/x11/kitty/files/docs-on-patch-setup.py new file mode 100644 index 000000000000..a37878e084e1 --- /dev/null +++ b/x11/kitty/files/docs-on-patch-setup.py @@ -0,0 +1,28 @@ +--- setup.py.orig 2018-12-06 05:25:15 UTC ++++ setup.py +@@ -600,16 +600,6 @@ def package(args, for_bundle=False, sh_launcher=False) + if os.path.exists(libdir): + shutil.rmtree(libdir) + os.makedirs(os.path.join(libdir, 'logo')) +- for x in (libdir, os.path.join(ddir, 'share')): +- odir = os.path.join(x, 'terminfo') +- safe_makedirs(odir) +- proc = subprocess.run(['tic', '-x', '-o' + odir, 'terminfo/kitty.terminfo'], check=True, stderr=subprocess.PIPE) +- regex = '^"terminfo/kitty.terminfo", line [0-9]+, col [0-9]+, terminal \'xterm-kitty\': older tic versions may treat the description field as an alias$' +- for error in proc.stderr.decode('utf-8').splitlines(): +- if not re.match(regex, error): +- print(error, file=sys.stderr) +- if not glob.glob(os.path.join(odir, '*/xterm-kitty')): +- raise SystemExit('tic failed to output the compiled kitty terminfo file') + shutil.copy2('__main__.py', libdir) + shutil.copy2('logo/kitty.rgba', os.path.join(libdir, 'logo')) + shutil.copy2('logo/beam-cursor.png', os.path.join(libdir, 'logo')) +@@ -823,7 +813,7 @@ def main(): + elif args.action == 'linux-package': + build(args, native_optimizations=False) + if not os.path.exists(os.path.join(base, 'docs/_build/html')): +- run_tool(['make', 'docs']) ++ run_tool(['gmake', 'docs']) + package(args) + elif args.action == 'osx-bundle': + build(args, native_optimizations=False) diff --git a/x11/kitty/files/patch-glfw_memfd.h b/x11/kitty/files/patch-glfw_memfd.h new file mode 100644 index 000000000000..4a1e222d6526 --- /dev/null +++ b/x11/kitty/files/patch-glfw_memfd.h @@ -0,0 +1,14 @@ +--- glfw/memfd.h.orig 2019-01-01 18:01:01 UTC ++++ glfw/memfd.h +@@ -6,7 +6,9 @@ + + #pragma once + +-#ifdef HAS_MEMFD_CREATE ++#ifdef __FreeBSD__ ++// use SHM_ANON ++#elif HAS_MEMFD_CREATE + + #include + #include + diff --git a/x11/kitty/files/patch-glfw_wl__init.c b/x11/kitty/files/patch-glfw_wl__init.c new file mode 100644 index 000000000000..b7a076dc619a --- /dev/null +++ b/x11/kitty/files/patch-glfw_wl__init.c @@ -0,0 +1,11 @@ +--- glfw/wl_init.c.orig 2019-02-17 23:49:36 UTC ++++ glfw/wl_init.c +@@ -31,7 +31,7 @@ + #include + #include + #include +-#include ++#include + #include + #include + #include diff --git a/x11/kitty/files/patch-glfw_wl__window.c b/x11/kitty/files/patch-glfw_wl__window.c new file mode 100644 index 000000000000..6297129b0cac --- /dev/null +++ b/x11/kitty/files/patch-glfw_wl__window.c @@ -0,0 +1,26 @@ +--- glfw/wl_window.c.orig 2019-01-01 17:59:15 UTC ++++ glfw/wl_window.c +@@ -140,7 +140,9 @@ static int + createAnonymousFile(off_t size) + { + int ret; +-#ifdef HAS_MEMFD_CREATE ++#ifdef __FreeBSD__ ++ int fd = shm_open(SHM_ANON, O_RDWR | O_CLOEXEC, 0600); ++#elif HAS_MEMFD_CREATE + int fd = memfd_create("glfw-shared", MFD_CLOEXEC | MFD_ALLOW_SEALING); + if (fd < 0) return -1; + // We can add this seal before calling posix_fallocate(), as the file +@@ -173,7 +175,11 @@ createAnonymousFile(off_t size) + if (fd < 0) + return -1; + #endif ++#ifdef __FreeBSD__ ++ ret = ftruncate(fd, size); ++#else + ret = posix_fallocate(fd, 0, size); ++#endif + if (ret != 0) + { + close(fd); + diff --git a/x11/kitty/files/patch-kitty_child.c b/x11/kitty/files/patch-kitty_child.c new file mode 100644 index 000000000000..823b328ca6f0 --- /dev/null +++ b/x11/kitty/files/patch-kitty_child.c @@ -0,0 +1,22 @@ +--- kitty/child.c.orig 2018-11-06 00:56:31 UTC ++++ kitty/child.c +@@ -12,6 +12,7 @@ + #include + #include + #include ++#include + + static inline char** + serialize_string_tuple(PyObject *src) { +@@ -87,10 +88,9 @@ spawn(PyObject *self UNUSED, PyObject *args) { + // Establish the controlling terminal (see man 7 credentials) + int tfd = open(name, O_RDWR); + if (tfd == -1) exit_on_err("Failed to open controlling terminal"); +-#ifdef TIOCSTTY ++ + // On BSD open() does not establish the controlling terminal + if (ioctl(tfd, TIOCSCTTY, 0) == -1) exit_on_err("Failed to set controlling terminal with TIOCSCTTY"); +-#endif + close(tfd); + + // Redirect stdin/stdout/stderr to the pty diff --git a/x11/kitty/files/patch-kitty_child.py b/x11/kitty/files/patch-kitty_child.py new file mode 100644 index 000000000000..423234394d19 --- /dev/null +++ b/x11/kitty/files/patch-kitty_child.py @@ -0,0 +1,19 @@ +--- kitty/child.py.orig 2019-02-18 00:01:25 UTC ++++ kitty/child.py +@@ -4,6 +4,7 @@ + + import fcntl + import os ++import pty + from collections import defaultdict + from contextlib import contextmanager + +@@ -153,7 +154,7 @@ class Child: + if self.forked: + return + self.forked = True +- master, slave = os.openpty() # Note that master and slave are in blocking mode ++ master, slave = pty.openpty() # Note that master and slave are in blocking mode + remove_cloexec(slave) + fast_data_types.set_iutf8(master, True) + stdin, self.stdin = self.stdin, None diff --git a/x11/kitty/pkg-descr b/x11/kitty/pkg-descr new file mode 100644 index 000000000000..f7ef5f288e7d --- /dev/null +++ b/x11/kitty/pkg-descr @@ -0,0 +1,20 @@ +Kitty is the fast, featureful, GPU based terminal emulator + : +kitty is designed for power keyboard users. To that end all its controls work +with the keyboard (although it fully supports mouse interactions as well). Its +configuration is a simple, human editable, single file for easy reproducibility +(I like to store configuration in source control). + +The code in kitty is designed to be simple, modular and hackable. It is written +in a mix of C (for performance sensitive parts) and Python (for easy hackability +of the UI). It does not depend on any large and complex UI toolkit, using only +OpenGL for rendering everything. + +Finally, kitty is designed from the ground up to support all modern terminal +features, such as unicode, true color, bold/italic fonts, text formatting, etc. +It even extends existing text formatting escape codes, to add support for +features not available elsewhere, such as colored and styled (curly) underlines. +One of the design goals of kitty is to be easily extensible so that new features +can be added in the future with relatively less effort. + +WWW: https://sw.kovidgoyal.net/kitty/ diff --git a/x11/kitty/pkg-plist b/x11/kitty/pkg-plist new file mode 100644 index 000000000000..ef90ae51ae54 --- /dev/null +++ b/x11/kitty/pkg-plist @@ -0,0 +1,90 @@ +bin/kitty +lib/kitty/__main__.py +lib/kitty/kittens/__init__.py +lib/kitty/kittens/ask/__init__.py +lib/kitty/kittens/ask/main.py +lib/kitty/kittens/clipboard/__init__.py +lib/kitty/kittens/clipboard/main.py +lib/kitty/kittens/diff/__init__.py +lib/kitty/kittens/diff/collect.py +lib/kitty/kittens/diff/config.py +lib/kitty/kittens/diff/config_data.py +lib/kitty/kittens/diff/diff_speedup.so +lib/kitty/kittens/diff/highlight.py +lib/kitty/kittens/diff/main.py +lib/kitty/kittens/diff/patch.py +lib/kitty/kittens/diff/render.py +lib/kitty/kittens/diff/search.py +lib/kitty/kittens/hints/__init__.py +lib/kitty/kittens/hints/main.py +lib/kitty/kittens/hints/url_regex.py +lib/kitty/kittens/icat/__init__.py +lib/kitty/kittens/icat/main.py +lib/kitty/kittens/panel/__init__.py +lib/kitty/kittens/panel/main.py +lib/kitty/kittens/resize_window/__init__.py +lib/kitty/kittens/resize_window/main.py +lib/kitty/kittens/runner.py +lib/kitty/kittens/show_error/__init__.py +lib/kitty/kittens/show_error/main.py +lib/kitty/kittens/ssh/__init__.py +lib/kitty/kittens/ssh/main.py +lib/kitty/kittens/tui/__init__.py +lib/kitty/kittens/tui/handler.py +lib/kitty/kittens/tui/images.py +lib/kitty/kittens/tui/line_edit.py +lib/kitty/kittens/tui/loop.py +lib/kitty/kittens/tui/operations.py +lib/kitty/kittens/unicode_input/__init__.py +lib/kitty/kittens/unicode_input/main.py +lib/kitty/kittens/unicode_input/unicode_names.so +lib/kitty/kitty/__init__.py +lib/kitty/kitty/blit_fragment.glsl +lib/kitty/kitty/blit_vertex.glsl +lib/kitty/kitty/border_fragment.glsl +lib/kitty/kitty/border_vertex.glsl +lib/kitty/kitty/borders.py +lib/kitty/kitty/boss.py +lib/kitty/kitty/cell_fragment.glsl +lib/kitty/kitty/cell_vertex.glsl +lib/kitty/kitty/child.py +lib/kitty/kitty/cli.py +lib/kitty/kitty/client.py +lib/kitty/kitty/cmds.py +lib/kitty/kitty/complete.py +lib/kitty/kitty/conf/__init__.py +lib/kitty/kitty/conf/definition.py +lib/kitty/kitty/conf/utils.py +lib/kitty/kitty/config.py +lib/kitty/kitty/config_data.py +lib/kitty/kitty/constants.py +lib/kitty/kitty/fast_data_types.so +lib/kitty/kitty/fonts/__init__.py +lib/kitty/kitty/fonts/box_drawing.py +lib/kitty/kitty/fonts/core_text.py +lib/kitty/kitty/fonts/fontconfig.py +lib/kitty/kitty/fonts/list.py +lib/kitty/kitty/fonts/render.py +lib/kitty/kitty/glfw-x11.so +lib/kitty/kitty/graphics_fragment.glsl +lib/kitty/kitty/graphics_vertex.glsl +lib/kitty/kitty/key_encoding.py +lib/kitty/kitty/keys.py +lib/kitty/kitty/launcher/kitty +lib/kitty/kitty/layout.py +lib/kitty/kitty/main.py +lib/kitty/kitty/remote_control.py +lib/kitty/kitty/rgb.py +lib/kitty/kitty/session.py +lib/kitty/kitty/shell.py +lib/kitty/kitty/tab_bar.py +lib/kitty/kitty/tabs.py +lib/kitty/kitty/terminfo.py +lib/kitty/kitty/utils.py +lib/kitty/kitty/window.py +lib/kitty/logo/beam-cursor.png +lib/kitty/logo/beam-cursor@2x.png +lib/kitty/logo/kitty.rgba +share/applications/kitty.desktop +share/icons/hicolor/256x256/apps/kitty.png +share/misc/kitty.terminfo -- 2.20.1