diff --git a/kitty/fonts.c b/kitty/fonts.c index e3fcd1eb9..9f5cc2b9d 100644 --- a/kitty/fonts.c +++ b/kitty/fonts.c @@ -1155,8 +1155,8 @@ finalize(void) { Py_CLEAR(prerender_function); Py_CLEAR(descriptor_for_idx); free_font_groups(); - if (harfbuzz_buffer) hb_buffer_destroy(harfbuzz_buffer); - free(group_state.groups); + if (harfbuzz_buffer) { hb_buffer_destroy(harfbuzz_buffer); harfbuzz_buffer = NULL; } + free(group_state.groups); group_state.groups = NULL; group_state.groups_capacity = 0; } static PyObject* @@ -1292,9 +1292,15 @@ create_test_font_group(PyObject *self UNUSED, PyObject *args) { return Py_BuildValue("II", fg->cell_width, fg->cell_height); } +static PyObject* +free_font_data(PyObject *self UNUSED, PyObject *args UNUSED) { + finalize(); + Py_RETURN_NONE; +} static PyMethodDef module_methods[] = { METHODB(set_font_data, METH_VARARGS), + METHODB(free_font_data, METH_NOARGS), METHODB(create_test_font_group, METH_VARARGS), METHODB(sprite_map_set_layout, METH_VARARGS), METHODB(test_sprite_position_for, METH_VARARGS), @@ -1309,10 +1315,6 @@ static PyMethodDef module_methods[] = { bool init_fonts(PyObject *module) { - if (Py_AtExit(finalize) != 0) { - PyErr_SetString(PyExc_RuntimeError, "Failed to register the fonts module at exit handler"); - return false; - } harfbuzz_buffer = hb_buffer_create(); if (harfbuzz_buffer == NULL || !hb_buffer_allocation_successful(harfbuzz_buffer) || !hb_buffer_pre_allocate(harfbuzz_buffer, 2048)) { PyErr_NoMemory(); return false; } hb_buffer_set_cluster_level(harfbuzz_buffer, HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS); diff --git a/kitty/main.py b/kitty/main.py index 5570a137e..8567047eb 100644 --- a/kitty/main.py +++ b/kitty/main.py @@ -15,8 +15,8 @@ from .constants import ( appname, config_dir, glfw_path, is_macos, is_wayland, logo_data_file ) from .fast_data_types import ( - create_os_window, glfw_init, glfw_terminate, set_default_window_icon, - set_options + create_os_window, free_font_data, glfw_init, glfw_terminate, + set_default_window_icon, set_options ) from .fonts.box_drawing import set_scale from .fonts.render import set_font_family @@ -38,10 +38,7 @@ def init_graphics(): return glfw_module -def run_app(opts, args): - set_scale(opts.box_drawing_scale) - set_options(opts, is_wayland, args.debug_gl, args.debug_font_fallback) - set_font_family(opts) +def _run_app(opts, args): with cached_values_for(run_app.cached_values_name) as cached_values: with startup_notification_handler(extra_callback=run_app.first_window_callback) as pre_show_callback: window_id = create_os_window( @@ -60,6 +57,16 @@ def run_app(opts, args): boss.destroy() +def run_app(opts, args): + set_scale(opts.box_drawing_scale) + set_options(opts, is_wayland, args.debug_gl, args.debug_font_fallback) + set_font_family(opts) + try: + _run_app(opts, args) + finally: + free_font_data() # must free font data before glfw/freetype/fontconfig/opengl etc are finalized + + run_app.cached_values_name = 'main' run_app.first_window_callback = lambda window_handle: None run_app.initial_window_size_func = initial_window_size_func