Merge branch 'v2.1.3-upstream' into amiga2.1

This commit is contained in:
George Sokianos 2024-02-11 16:02:19 +00:00
commit 66fb996e76
20 changed files with 576 additions and 129 deletions

View File

@ -9,7 +9,7 @@ on:
inputs: inputs:
version: version:
description: Release Version description: Release Version
default: v2.1.1 default: v2.1.3
required: true required: true
jobs: jobs:

View File

@ -1,5 +1,452 @@
# Changes Log # Changes Log
## [2.1.3] - 2024-01-29
This release addresses severe bugs not found in previous releases.
### Fixes
* Fix `doc:create-cursor-{previous,next}-line` with tabs
([#1697](https://github.com/lite-xl/lite-xl/pull/1697))
* Fix heap buffer overflow and memory leaks in process and renderer API
([#1705](https://github.com/lite-xl/lite-xl/pull/1705))
* Improve Python number syntax highlighting
([#1704](https://github.com/lite-xl/lite-xl/pull/1704))
* Fix inconsistent NagView options on `doc:save`
([#1696](https://github.com/lite-xl/lite-xl/pull/1696))
* Fix crashes with autoreload when files are deleted externally and replaced with a directory.
([#1698](https://github.com/lite-xl/lite-xl/pull/1698))
* Improve JavaScript number syntax highlighting
([#1710](https://github.com/lite-xl/lite-xl/pull/1710))
### Other Changes
* Process API style changes
([#1709](https://github.com/lite-xl/lite-xl/pull/1709))
## [2.1.2] - 2023-12-29
This release addresses some issues present in the previous release,
and improves the performance and stability of Lite XL.
### New Features
* The context menu in TreeView is now navigable with a keyboard.
([#1338](https://github.com/lite-xl/lite-xl/pull/1338))
* A universal build of Lite XL is now available for macOS.
This build runs natively on both Intel and Apple Silicon macs.
([#1458](https://github.com/lite-xl/lite-xl/pull/1458))
* Most Unicode characters should be displayed properly
if your fonts support them.
([#1524](https://github.com/lite-xl/lite-xl/pull/1524))
* LogView will no longer scroll automatically if the user had scrolled.
The LogView will only scroll automatically when the user scrolls up
to the last entry.
([#1546](https://github.com/lite-xl/lite-xl/pull/1546))
* When using different fonts (especially fonts that render different scripts),
the letters will be aligned vertically.
([#1560](https://github.com/lite-xl/lite-xl/pull/1560))
* Unsaved named files are now saved in the workspace.
([#1597](https://github.com/lite-xl/lite-xl/pull/1597))
* macOS builds are now signed with a developer certificate.
This allows the user to right click the application in Finder and execute
it directly.
([#1656](https://github.com/lite-xl/lite-xl/pull/1656))
### Performance Improvements
* Allow command buffer to be expanded.
([#1297](https://github.com/lite-xl/lite-xl/pull/1297))
* Use table.move to implement `common.splice`.
([#1324](https://github.com/lite-xl/lite-xl/pull/1324))
* Create renderer only when it doesn't exist.
([#1315](https://github.com/lite-xl/lite-xl/pull/1315))
* Avoid drawing hidden text in `DocView:draw_line_text`.
([#1298](https://github.com/lite-xl/lite-xl/pull/1298))
* Don't calculate widths per-uft8-char when not needed.
([#1409](https://github.com/lite-xl/lite-xl/pull/1409))
* Allow tokenizer to pause and resume in the middle of a line.
([#1444](https://github.com/lite-xl/lite-xl/pull/1444))
* Optimize CI build times on MSYS2.
([#1435](https://github.com/lite-xl/lite-xl/pull/1435))
* Significant memory usage improvements when using huge fonts on Windows.
([#1555](https://github.com/lite-xl/lite-xl/pull/1555))
* Optimize background tasks response time.
([#1601](https://github.com/lite-xl/lite-xl/pull/1601))
### Backward Incompatible Changes
* The native plugin API is now usable on multiple source files,
without causing any duplicated symbol errors during compilation.
Plugins using the new plugin API header must define `LITE_XL_PLUGIN_ENTRYPOINT`
before importing the header, in one of their source files.
([#1335](https://github.com/lite-xl/lite-xl/pull/1335))
* The native plugin API header now follows the Lua 5.4 API.
Previously, the plugin API header followed the Lua 5.2 API.
([#1436](https://github.com/lite-xl/lite-xl/pull/1436))
* On Linux, `process.start()` will now throw an error if `execv()` fails.
([#1363](https://github.com/lite-xl/lite-xl/pull/1363))
* Lite XL will use the default `SCALE` of 1 due to unreliable display
scale detection. This may be fixed in a later version of Lite XL.
Set the `LITE_SCALE` environment variable to override this value.
### Fixes
* Fix minor typos in user module
([#1289](https://github.com/lite-xl/lite-xl/pull/1289))
* Do not allow users to create an empty font group
([#1303](https://github.com/lite-xl/lite-xl/pull/1303))
* Fix a memory leak
([#1305](https://github.com/lite-xl/lite-xl/pull/1305))
* Make dirwatch sorting compatible with what file_bisect expects
([#1300](https://github.com/lite-xl/lite-xl/pull/1300))
* Handle readlink errors
([#1292](https://github.com/lite-xl/lite-xl/pull/1292))
* Disable horizontal scrolling when linewrapping is enabled
([#1309](https://github.com/lite-xl/lite-xl/pull/1309))
* Update widgets install location
* Add missing luaL_typeerror symbol to plugin API
([#1313](https://github.com/lite-xl/lite-xl/pull/1313))
* Defer lua error until after cleanup
([#1310](https://github.com/lite-xl/lite-xl/pull/1310))
* Make empty groups in regex.gmatch return their offset
([#1325](https://github.com/lite-xl/lite-xl/pull/1325))
* Add missing header declaration
* Fix msys build now requiring ca-certificates
([#1348](https://github.com/lite-xl/lite-xl/pull/1348))
* Fix path to macOS arm64 cross file in GitHub workflows
* Fix Doc contextmenu not registering commands if scale plugin is not found
([#1338](https://github.com/lite-xl/lite-xl/pull/1338))
* Fix TreeView contextmenu commands not working if the mouse hovers DocView
([#1338](https://github.com/lite-xl/lite-xl/pull/1338))
* Fix incorrect contextmenu predicate
([#1338](https://github.com/lite-xl/lite-xl/pull/1338))
* Properly rescale NagView on scale change
([#1379](https://github.com/lite-xl/lite-xl/pull/1379))
* Scale plugin also rescales `style.expanded_scrollbar_size`
([#1380](https://github.com/lite-xl/lite-xl/pull/1380))
* Improve DocView:get_visible_line_range precision
([#1382](https://github.com/lite-xl/lite-xl/pull/1382))
* Fix up some post 5.1/JIT Symbols
([#1385](https://github.com/lite-xl/lite-xl/pull/1385))
* Fix incorrect x_offset if opened docs have different tab sizes
([#1383](https://github.com/lite-xl/lite-xl/pull/1383))
* Use correct view for scrolling to find-replace:repeat-find results
([#1400](https://github.com/lite-xl/lite-xl/pull/1400))
* Improve text width calculation precision
([#1408](https://github.com/lite-xl/lite-xl/pull/1408))
* Add asynchronous process reaping
([#1412](https://github.com/lite-xl/lite-xl/pull/1412))
* Fix cursors positions when deleting multiple selections
([#1393](https://github.com/lite-xl/lite-xl/pull/1393),
[#1463](https://github.com/lite-xl/lite-xl/pull/1463))
* Fix invalid EXEFILE and EXEDIR on Windows
([#1396](https://github.com/lite-xl/lite-xl/pull/1396))
* Fix `os.getenv()` not supporting UTF-8 output
([#1397](https://github.com/lite-xl/lite-xl/pull/1397))
* Fix differing stacktrace on stdout and file
([#1404](https://github.com/lite-xl/lite-xl/pull/1404))
* Update api_require to expose more symbols
([#1437](https://github.com/lite-xl/lite-xl/pull/1437))
* Make system.path_compare more case-aware
([#1457](https://github.com/lite-xl/lite-xl/pull/1457))
* Fix for api_require wrong macro && conditions
([#1465](https://github.com/lite-xl/lite-xl/pull/1465))
* Merge carets after doc:move-to-{previous,next}-char
([#1462](https://github.com/lite-xl/lite-xl/pull/1462))
* Process API improvements (again)
([#1370](https://github.com/lite-xl/lite-xl/pull/1370))
* Make system.path_compare more digit-aware
([#1474](https://github.com/lite-xl/lite-xl/pull/1474))
* Check for HANDLE_INVALID in Process API
([#1475](https://github.com/lite-xl/lite-xl/pull/1475))
* Fix linewrapping bug to do with wordwrapping
* Fix compiler warning for printing size_t in rencache.c
* Return error string from C searcher
* Restore horizontal scroll position after scale change
([#494](https://github.com/lite-xl/lite-xl/pull/494))
* Fix memory leak in renderer.c when freeing glyphsets
* Move lineguide below blinking cursor
([#1511](https://github.com/lite-xl/lite-xl/pull/1511))
* Close lua state when exiting on a runtime error
([#1487](https://github.com/lite-xl/lite-xl/pull/1487))
* Mark linewrapping open_files table as weak
* Don't use core.status_view if not yet initialized when logging
* Revert "core syntax: strip the path from filename on syntax.get ([#1168](https://github.com/lite-xl/lite-xl/pull/1168))"
([#1322](https://github.com/lite-xl/lite-xl/pull/1322))
* Make Doc:sanitize_position return a more appropriate col
([#1469](https://github.com/lite-xl/lite-xl/pull/1469))
* Skip checking files if no filename was provided to syntax.get
* Normalize stroke before adding keybind
([#1334](https://github.com/lite-xl/lite-xl/pull/1334))
* Make DocView aware of scrollbars sizes
([#1177](https://github.com/lite-xl/lite-xl/pull/1177))
* Normalize strokes in fixed order
([#1572](https://github.com/lite-xl/lite-xl/pull/1572))
* Defer core:open-log until everything is loaded
([#1585](https://github.com/lite-xl/lite-xl/pull/1585))
* Fix returned percent when clicking the Scrollbar track
* Fix C++14 digit separators
([#1593](https://github.com/lite-xl/lite-xl/pull/1593))
* Make linewrapping consider the expanded Scrollbar size
* Fix dimmed text when antialiasing is turned off
([#1641](https://github.com/lite-xl/lite-xl/pull/1641))
* Mark unsaved named files as dirty
([#1598](https://github.com/lite-xl/lite-xl/pull/1598))
* Make `common.serialize()` locale-independent and nan/inf compatible
([#1640](https://github.com/lite-xl/lite-xl/pull/1640))
* Ignore keypresses during IME composition
([#1573](https://github.com/lite-xl/lite-xl/pull/1573))
* Fix deadlock if error handler jumps somewhere else
([#1647](https://github.com/lite-xl/lite-xl/pull/1647))
* Avoid considering single spaces in detectindent
([#1595](https://github.com/lite-xl/lite-xl/pull/1595))
* Fix deleting indentation with multiple cursors
([#1670](https://github.com/lite-xl/lite-xl/pull/1670))
* Fix `set_target_size` passing the wrong value to plugins
([#1657](https://github.com/lite-xl/lite-xl/pull/1657))
* Limit `system.{sleep,wait_event}` to `timeouts >= 0`
([#1666](https://github.com/lite-xl/lite-xl/pull/1666))
* Fix running core.step when receiving an event while not waiting
([#1667](https://github.com/lite-xl/lite-xl/pull/1667))
* Fix dirmonitor sorting issues
([#1599](https://github.com/lite-xl/lite-xl/pull/1599))
* Scale mouse coordinates by window scale
([#1630](https://github.com/lite-xl/lite-xl/pull/1630))
* Made coroutines make more sense, and fixed a bug
([#1381](https://github.com/lite-xl/lite-xl/pull/1381))
* Fix selecting newlines with `find-replace:select-add-{next,all}`
([#1608](https://github.com/lite-xl/lite-xl/pull/1608))
* Fix editing after undo not clearing the change id
([#1574](https://github.com/lite-xl/lite-xl/pull/1574))
* Fix language_js regex constant detection
([#1581](https://github.com/lite-xl/lite-xl/pull/1581))
* Fix patterns starting with `^` in tokenizer
([#1645](https://github.com/lite-xl/lite-xl/pull/1645))
* Use x offset to define render command rect in rencache_draw_text
([#1618](https://github.com/lite-xl/lite-xl/pull/1618))
* Improve font/color change detection in `language_md`
([#1614](https://github.com/lite-xl/lite-xl/pull/1614))
* Allow long commands and envs on process_start
([#1477](https://github.com/lite-xl/lite-xl/pull/1477))
* Fix typo in `drawwhitespace.lua`
* Fix NagBar save failed message
([#1678](https://github.com/lite-xl/lite-xl/pull/1678))
* Fix typo in `drawwhitespace.lua`
* Add autocompletion to multicursor
([#1394](https://github.com/lite-xl/lite-xl/pull/1394))
### Other Changes
* Make api_require's nodes const
([#1296](https://github.com/lite-xl/lite-xl/pull/1296))
* Don't set a value twice
([#1306](https://github.com/lite-xl/lite-xl/pull/1306))
* Center title and version in emptyview
([#1311](https://github.com/lite-xl/lite-xl/pull/1311))
* Use master branch for packaging plugins for addons release
* Reorganize resources folder and add wasm target
([#1244](https://github.com/lite-xl/lite-xl/pull/1244))
* Replace uses of SDL_Window with RenWindow
([#1319](https://github.com/lite-xl/lite-xl/pull/1319))
* Update dummy dirmonitor method signature to match prototypes
* Remove static libgcc from meson
([#1290](https://github.com/lite-xl/lite-xl/pull/1290))
* Pass RenWindow by argument
([#1321](https://github.com/lite-xl/lite-xl/pull/1321))
* Get rid of annoying forward slash on windows
([#1345](https://github.com/lite-xl/lite-xl/pull/1345))
* Improve plugins config table handling
([#1356](https://github.com/lite-xl/lite-xl/pull/1356))
* Add manifest on Windows
([#1405](https://github.com/lite-xl/lite-xl/pull/1405))
* Split Command struct into different structs for each command type
([#1407](https://github.com/lite-xl/lite-xl/pull/1407))
* Move SetProcessDPIAware to manifests
([#1413](https://github.com/lite-xl/lite-xl/pull/1413))
* Use clipping functions provided by SDL
([#1426](https://github.com/lite-xl/lite-xl/pull/1426))
* Aggregate SDL_Surfaces and their scale in RenSurface
([#1429](https://github.com/lite-xl/lite-xl/pull/1429))
* Disable trimwhitespace and drawwhitespace via their configs
([#1446](https://github.com/lite-xl/lite-xl/pull/1446))
* Bump dependency versions
([#1434](https://github.com/lite-xl/lite-xl/pull/1434))
* Improvements to cross-compilation
([#1458](https://github.com/lite-xl/lite-xl/pull/1458))
* Move native plugin API header into include/
([#1440](https://github.com/lite-xl/lite-xl/pull/1440))
* Build releases with Ubuntu 18.04 container
([#1460](https://github.com/lite-xl/lite-xl/pull/1460))
* Update GitHub Actions dependencies
* Make all parameters for set_window_hit_test optional in documentation
* Attach command buffer to Renderer Window
([#1472](https://github.com/lite-xl/lite-xl/pull/1472))
* Fix comment typo in object.lua
([#1541](https://github.com/lite-xl/lite-xl/pull/1541))
* Allow setting custom glyphset size
([#1542](https://github.com/lite-xl/lite-xl/pull/1542))
* Use FreeType header names in renderer.c
([#1554](https://github.com/lite-xl/lite-xl/pull/1554))
* Add documentation for core.common
([#1510](https://github.com/lite-xl/lite-xl/pull/1510))
* Document missing parameter for system.path_compare
([#1566](https://github.com/lite-xl/lite-xl/pull/1566))
* Add documentation for core.command
([#1564](https://github.com/lite-xl/lite-xl/pull/1564))
* Update the *Installing prebuild* section in README.md
([#1548](https://github.com/lite-xl/lite-xl/pull/1548))
* Update README.md to remove previously installed files
prior to installing a new version
* Use lite-xl Build Box to build releases
([#1571](https://github.com/lite-xl/lite-xl/pull/1571))
* Use Lua wrap by default
([#1481](https://github.com/lite-xl/lite-xl/pull/1481))
* Add documentation for contextmenu
([#1567](https://github.com/lite-xl/lite-xl/pull/1567))
* Use dmgbuild to create DMGs
([#1664](https://github.com/lite-xl/lite-xl/pull/1664))
* Un-hardcode lua subproject detection and update dependencies
([#1676](https://github.com/lite-xl/lite-xl/pull/1676))
* Make license time-independent
([#1655](https://github.com/lite-xl/lite-xl/pull/1655))
## [2.1.1] - 2022-12-29 ## [2.1.1] - 2022-12-29
### New Features ### New Features
@ -1004,6 +1451,8 @@ A new global variable `USERDIR` is exposed to point to the user's directory.
- subpixel font rendering with gamma correction - subpixel font rendering with gamma correction
[2.1.3]: https://github.com/lite-xl/lite-xl/releases/tag/v2.1.3
[2.1.2]: https://github.com/lite-xl/lite-xl/releases/tag/v2.1.2
[2.1.1]: https://github.com/lite-xl/lite-xl/releases/tag/v2.1.1 [2.1.1]: https://github.com/lite-xl/lite-xl/releases/tag/v2.1.1
[2.1.0]: https://github.com/lite-xl/lite-xl/releases/tag/v2.1.0 [2.1.0]: https://github.com/lite-xl/lite-xl/releases/tag/v2.1.0
[2.0.5]: https://github.com/lite-xl/lite-xl/releases/tag/v2.0.5 [2.0.5]: https://github.com/lite-xl/lite-xl/releases/tag/v2.0.5

View File

@ -44,8 +44,8 @@ local function save(filename)
else else
core.error(err) core.error(err)
core.nag_view:show("Saving failed", string.format("Couldn't save file \"%s\". Do you want to save to another location?", doc().filename), { core.nag_view:show("Saving failed", string.format("Couldn't save file \"%s\". Do you want to save to another location?", doc().filename), {
{ text = "No", default_no = true }, { text = "Yes", default_yes = true },
{ text = "Yes", default_yes = true } { text = "No", default_no = true }
}, function(item) }, function(item)
if item.text == "Yes" then if item.text == "Yes" then
core.add_thread(function() core.add_thread(function()
@ -93,11 +93,14 @@ local function cut_or_copy(delete)
system.set_clipboard(full_text) system.set_clipboard(full_text)
end end
local function split_cursor(direction) local function split_cursor(dv, direction)
local new_cursors = {} local new_cursors = {}
for _, line1, col1 in doc():get_selections() do local dv_translate = direction < 0
if line1 + direction >= 1 and line1 + direction <= #doc().lines then and DocView.translate.previous_line
table.insert(new_cursors, { line1 + direction, col1 }) or DocView.translate.next_line
for _, line1, col1 in dv.doc:get_selections() do
if line1 + direction >= 1 and line1 + direction <= #dv.doc.lines then
table.insert(new_cursors, { dv_translate(dv.doc, line1, col1, dv) })
end end
end end
-- add selections in the order that will leave the "last" added one as doc.last_selection -- add selections in the order that will leave the "last" added one as doc.last_selection
@ -107,7 +110,7 @@ local function split_cursor(direction)
end end
for i = start, stop, direction do for i = start, stop, direction do
local v = new_cursors[i] local v = new_cursors[i]
doc():add_selection(v[1], v[2]) dv.doc:add_selection(v[1], v[2])
end end
core.blink_reset() core.blink_reset()
end end
@ -626,12 +629,12 @@ local commands = {
end, end,
["doc:create-cursor-previous-line"] = function(dv) ["doc:create-cursor-previous-line"] = function(dv)
split_cursor(-1) split_cursor(dv, -1)
dv.doc:merge_cursors() dv.doc:merge_cursors()
end, end,
["doc:create-cursor-next-line"] = function(dv) ["doc:create-cursor-next-line"] = function(dv)
split_cursor(1) split_cursor(dv, 1)
dv.doc:merge_cursors() dv.doc:merge_cursors()
end end

View File

@ -257,14 +257,7 @@ config.skip_plugins_version = false
-- holds the plugins real config table -- holds the plugins real config table
local plugins_config = {} local plugins_config = {}
---A table containing configuration for all the plugins. -- virtual representation of plugins config table
---
---This is a metatable that automaticaly creates a minimal
---configuration when a plugin is initially configured.
---Each plugins will then call `common.merge()` to get the finalized
---plugin config.
---Do not use raw operations on this table.
---@type table
config.plugins = {} config.plugins = {}
-- allows virtual access to the plugins config table -- allows virtual access to the plugins config table

View File

@ -1412,10 +1412,11 @@ local run_threads = coroutine.wrap(function()
else else
core.threads[k] = nil core.threads[k] = nil
end end
else elseif wait then
wait = wait or (1/30)
thread.wake = system.get_time() + wait thread.wake = system.get_time() + wait
minimal_time_to_wake = math.min(minimal_time_to_wake, wait) minimal_time_to_wake = math.min(minimal_time_to_wake, wait)
else
minimal_time_to_wake = 0
end end
else else
minimal_time_to_wake = math.min(minimal_time_to_wake, thread.wake - system.get_time()) minimal_time_to_wake = math.min(minimal_time_to_wake, thread.wake - system.get_time())

View File

@ -13,6 +13,6 @@ modkeys.map = {
["right windows"] = "super" ["right windows"] = "super"
} }
modkeys.keys = { "ctrl", "shift", "alt", "altgr", "super" } modkeys.keys = { "ctrl", "shift", "alt", "altgr" }
return modkeys return modkeys

View File

@ -139,6 +139,8 @@ function tokenizer.tokenize(incoming_syntax, text, state, resume)
return { "normal", text }, state return { "normal", text }, state
end end
state = state or string.char(0)
if resume then if resume then
res = resume.res res = resume.res
-- Remove "incomplete" tokens -- Remove "incomplete" tokens

View File

@ -69,7 +69,7 @@ function dirwatch:check(change_callback, ...)
for _, doc in ipairs(core.docs) do for _, doc in ipairs(core.docs) do
if doc.abs_filename and (dir == common.dirname(doc.abs_filename) or dir == doc.abs_filename) then if doc.abs_filename and (dir == common.dirname(doc.abs_filename) or dir == doc.abs_filename) then
local info = system.get_file_info(doc.filename or "") local info = system.get_file_info(doc.filename or "")
if info and times[doc] ~= info.modified then if info and info.type == "file" and times[doc] ~= info.modified then
if not doc:is_dirty() and not config.plugins.autoreload.always_show_nagview then if not doc:is_dirty() and not config.plugins.autoreload.always_show_nagview then
reload_doc(doc) reload_doc(doc)
else else

View File

@ -57,18 +57,18 @@ syntax.add {
comment = "//", comment = "//",
block_comment = { "/*", "*/" }, block_comment = { "/*", "*/" },
patterns = { patterns = {
{ pattern = "//.*", type = "comment" }, { pattern = "//.*", type = "comment" },
{ pattern = { "/%*", "%*/" }, type = "comment" }, { pattern = { "/%*", "%*/" }, type = "comment" },
{ regex = regex_pattern, syntax = inner_regex_syntax, type = {"string", "string"} }, { regex = regex_pattern, syntax = inner_regex_syntax, type = {"string", "string"} },
{ pattern = { '"', '"', '\\' }, type = "string" }, { pattern = { '"', '"', '\\' }, type = "string" },
{ pattern = { "'", "'", '\\' }, type = "string" }, { pattern = { "'", "'", '\\' }, type = "string" },
{ pattern = { "`", "`", '\\' }, type = "string" }, { pattern = { "`", "`", '\\' }, type = "string" },
{ pattern = "0x[%da-fA-F_]+n?()%s*()/?", type = {"number", "normal", "operator"} }, { pattern = "-?0[xXbBoO][%da-fA-F_]+n?()%s*()/?", type = {"number", "normal", "operator"} },
{ pattern = "-?%d+[%d%.eE_n]*()%s*()/?", type = {"number", "normal", "operator"} }, { pattern = "-?%d+[%d%.eE_n]*()%s*()/?", type = {"number", "normal", "operator"} },
{ pattern = "-?%.?%d+()%s*()/?", type = {"number", "normal", "operator"} }, { pattern = "-?%.?%d+()%s*()/?", type = {"number", "normal", "operator"} },
{ pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" }, { pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
{ pattern = "[%a_][%w_]*%f[(]", type = "function" }, { pattern = "[%a_][%w_]*%f[(]", type = "function" },
{ pattern = "[%a_][%w_]*()%s*()/?", type = {"symbol", "normal", "operator"} }, { pattern = "[%a_][%w_]*()%s*()/?", type = {"symbol", "normal", "operator"} },
}, },
symbols = { symbols = {
["async"] = "keyword", ["async"] = "keyword",

View File

@ -16,8 +16,8 @@ syntax.add {
{ pattern = { "[ruU]?'''", "'''", '\\' }, type = "string" }, { pattern = { "[ruU]?'''", "'''", '\\' }, type = "string" },
{ pattern = { '[ruU]?"', '"', '\\' }, type = "string" }, { pattern = { '[ruU]?"', '"', '\\' }, type = "string" },
{ pattern = { "[ruU]?'", "'", '\\' }, type = "string" }, { pattern = { "[ruU]?'", "'", '\\' }, type = "string" },
{ pattern = "0x[%da-fA-F]+", type = "number" }, { pattern = "-?0[xboXBO][%da-fA-F_]+",type = "number" },
{ pattern = "-?%d+[%d%.eE]*", type = "number" }, { pattern = "-?%d+[%d%.eE_]*", type = "number" },
{ pattern = "-?%.?%d+", type = "number" }, { pattern = "-?%.?%d+", type = "number" },
{ pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" }, { pattern = "[%+%-=/%*%^%%<>!~|&]", type = "operator" },
{ pattern = "[%a_][%w_]*%f[(]", type = "function" }, { pattern = "[%a_][%w_]*%f[(]", type = "function" },

View File

@ -1,6 +1,6 @@
project('lite-xl', project('lite-xl',
['c'], ['c'],
version : '2.1.1', version : '2.1.3',
license : 'MIT', license : 'MIT',
meson_version : '>= 0.56', meson_version : '>= 0.56',
default_options : [ default_options : [
@ -101,7 +101,7 @@ if not get_option('source-only')
endforeach endforeach
else else
lua_dep = dependency('', fallback: ['lua', 'lua_dep'], required : true, lua_dep = dependency('', fallback: ['lua', 'lua_dep'], required : true,
default_options: default_fallback_options + ['default_library=static', 'line_editing=disabled', 'interpreter=false'] default_options: default_fallback_options + ['default_library=static', 'line_editing=false', 'interpreter=false']
) )
endif endif

View File

@ -31,14 +31,9 @@
* An example command would be: gcc -shared -o xxxxx.so xxxxx.c * An example command would be: gcc -shared -o xxxxx.so xxxxx.c
* You must not link to ANY lua library to avoid symbol collision. * You must not link to ANY lua library to avoid symbol collision.
* *
* This file contains stock configuration for a typical installation of Lua 5.4.6. * This file contains stock configuration for a typical installation of Lua 5.4.
* DO NOT MODIFY ANYTHING. MODIFYING STUFFS IN HERE WILL BREAK * DO NOT MODIFY ANYTHING. MODIFYING STUFFS IN HERE WILL BREAK
* COMPATIBILITY WITH LITE XL AND CAUSE UNDEBUGGABLE BUGS. * COMPATIBILITY WITH LITE XL AND CAUSE UNDEBUGGABLE BUGS.
*
* For reference, here are a list of permalinks to previous version of this file that targets an older version of Lua.
* If you don't need functionalities offered by the new version, use the OLDEST FILE for backwards compatibility.
*
* - Lua 5.4.4: https://github.com/lite-xl/lite-xl/blob/397973067f14420b26e3b20a238a50016c0b75e2/resources/include/lite_xl_plugin_api.h
**/ **/
#ifndef LITE_XL_PLUGIN_API #ifndef LITE_XL_PLUGIN_API
#define LITE_XL_PLUGIN_API #define LITE_XL_PLUGIN_API
@ -1033,7 +1028,6 @@ extern const char lua_ident[];
SYMBOL_DECLARE(lua_State *, lua_newstate, lua_Alloc f, void *ud) SYMBOL_DECLARE(lua_State *, lua_newstate, lua_Alloc f, void *ud)
SYMBOL_DECLARE(void, lua_close, lua_State *L) SYMBOL_DECLARE(void, lua_close, lua_State *L)
SYMBOL_DECLARE(lua_State *, lua_newthread, lua_State *L) SYMBOL_DECLARE(lua_State *, lua_newthread, lua_State *L)
SYMBOL_DECLARE(int, lua_closethread, lua_State *L, lua_State *from)
SYMBOL_DECLARE(int, lua_resetthread, lua_State *L) SYMBOL_DECLARE(int, lua_resetthread, lua_State *L)
SYMBOL_DECLARE(lua_CFunction, lua_atpanic, lua_State *L, lua_CFunction panicf) SYMBOL_DECLARE(lua_CFunction, lua_atpanic, lua_State *L, lua_CFunction panicf)
@ -1745,9 +1739,6 @@ SYMBOL_WRAP_DECL(void, lua_close, lua_State *L) {
SYMBOL_WRAP_DECL(lua_State *, lua_newthread, lua_State *L) { SYMBOL_WRAP_DECL(lua_State *, lua_newthread, lua_State *L) {
return SYMBOL_WRAP_CALL(lua_newthread, L); return SYMBOL_WRAP_CALL(lua_newthread, L);
} }
SYMBOL_WRAP_DECL(int, lua_closethread, lua_State *L, lua_State *from) {
return SYMBOL_WRAP_CALL(lua_closethread, L, from);
}
SYMBOL_WRAP_DECL(int, lua_resetthread, lua_State *L) { SYMBOL_WRAP_DECL(int, lua_resetthread, lua_State *L) {
return SYMBOL_WRAP_CALL(lua_resetthread, L); return SYMBOL_WRAP_CALL(lua_resetthread, L);
} }
@ -2360,7 +2351,6 @@ void lite_xl_plugin_init(void *XL) {
IMPORT_SYMBOL(lua_newstate, lua_State *, lua_Alloc f, void *ud); IMPORT_SYMBOL(lua_newstate, lua_State *, lua_Alloc f, void *ud);
IMPORT_SYMBOL(lua_close, void, lua_State *L); IMPORT_SYMBOL(lua_close, void, lua_State *L);
IMPORT_SYMBOL(lua_newthread, lua_State *, lua_State *L); IMPORT_SYMBOL(lua_newthread, lua_State *, lua_State *L);
IMPORT_SYMBOL(lua_closethread, int, lua_State *L, lua_State *from);
IMPORT_SYMBOL(lua_resetthread, int, lua_State *L); IMPORT_SYMBOL(lua_resetthread, int, lua_State *L);
IMPORT_SYMBOL(lua_atpanic, lua_CFunction, lua_State *L, lua_CFunction panicf); IMPORT_SYMBOL(lua_atpanic, lua_CFunction, lua_State *L, lua_CFunction panicf);
IMPORT_SYMBOL(lua_version, lua_Number, lua_State *L); IMPORT_SYMBOL(lua_version, lua_Number, lua_State *L);

View File

@ -29,6 +29,6 @@
</provides> </provides>
<releases> <releases>
<release version="2.1.1" date="2022-12-29" /> <release version="2.1.3" date="2024-01-29" />
</releases> </releases>
</component> </component>

View File

@ -1,6 +1,6 @@
diff -ruN lua-5.4.4/meson.build lua-5.4.4-patched/meson.build diff -ruN lua-5.4.4\meson.build lua-5.4.4-patched\meson.build
--- lua-5.4.4/meson.build Wed Feb 22 18:16:56 2023 --- lua-5.4.4\meson.build Wed Feb 22 18:16:56 2023
+++ lua-5.4.4-patched/meson.build Wed Feb 22 04:10:01 2023 +++ lua-5.4.4-patched\meson.build Wed Feb 22 04:10:01 2023
@@ -85,6 +85,7 @@ @@ -85,6 +85,7 @@
'src/lutf8lib.c', 'src/lutf8lib.c',
'src/lvm.c', 'src/lvm.c',
@ -9,9 +9,9 @@ diff -ruN lua-5.4.4/meson.build lua-5.4.4-patched/meson.build
dependencies: lua_lib_deps, dependencies: lua_lib_deps,
version: meson.project_version(), version: meson.project_version(),
soversion: lua_versions[0] + '.' + lua_versions[1], soversion: lua_versions[0] + '.' + lua_versions[1],
diff -ruN lua-5.4.4/src/luaconf.h lua-5.4.4-patched/src/luaconf.h diff -ruN lua-5.4.4\src\luaconf.h lua-5.4.4-patched\src\luaconf.h
--- lua-5.4.4/src/luaconf.h Thu Jan 13 19:24:43 2022 --- lua-5.4.4\src\luaconf.h Thu Jan 13 19:24:43 2022
+++ lua-5.4.4-patched/src/luaconf.h Wed Feb 22 04:10:02 2023 +++ lua-5.4.4-patched\src\luaconf.h Wed Feb 22 04:10:02 2023
@@ -782,5 +782,15 @@ @@ -782,5 +782,15 @@
@ -28,9 +28,9 @@ diff -ruN lua-5.4.4/src/luaconf.h lua-5.4.4-patched/src/luaconf.h
+ +
#endif #endif
diff -ruN lua-5.4.4/src/Makefile lua-5.4.4-patched/src/Makefile diff -ruN lua-5.4.4\src\Makefile lua-5.4.4-patched\src\Makefile
--- lua-5.4.4/src/Makefile Thu Jul 15 22:01:52 2021 --- lua-5.4.4\src\Makefile Thu Jul 15 22:01:52 2021
+++ lua-5.4.4-patched/src/Makefile Wed Feb 22 04:10:02 2023 +++ lua-5.4.4-patched\src\Makefile Wed Feb 22 04:10:02 2023
@@ -33,7 +33,7 @@ @@ -33,7 +33,7 @@
PLATS= guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris PLATS= guess aix bsd c89 freebsd generic linux linux-readline macosx mingw posix solaris
@ -40,9 +40,9 @@ diff -ruN lua-5.4.4/src/Makefile lua-5.4.4-patched/src/Makefile
LIB_O= lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o LIB_O= lauxlib.o lbaselib.o lcorolib.o ldblib.o liolib.o lmathlib.o loadlib.o loslib.o lstrlib.o ltablib.o lutf8lib.o linit.o
BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS) BASE_O= $(CORE_O) $(LIB_O) $(MYOBJS)
diff -ruN lua-5.4.4/src/utf8_wrappers.c lua-5.4.4-patched/src/utf8_wrappers.c diff -ruN lua-5.4.4\src\utf8_wrappers.c lua-5.4.4-patched\src\utf8_wrappers.c
--- lua-5.4.4/src/utf8_wrappers.c Thu Jan 01 08:00:00 1970 --- lua-5.4.4\src\utf8_wrappers.c Thu Jan 01 08:00:00 1970
+++ lua-5.4.4-patched/src/utf8_wrappers.c Wed Feb 22 18:13:45 2023 +++ lua-5.4.4-patched\src\utf8_wrappers.c Wed Feb 22 18:13:45 2023
@@ -0,0 +1,129 @@ @@ -0,0 +1,129 @@
+/** +/**
+ * Wrappers to provide Unicode (UTF-8) support on Windows. + * Wrappers to provide Unicode (UTF-8) support on Windows.
@ -173,9 +173,9 @@ diff -ruN lua-5.4.4/src/utf8_wrappers.c lua-5.4.4-patched/src/utf8_wrappers.c
+ return env_value; + return env_value;
+} +}
+#endif +#endif
diff -ruN lua-5.4.4/src/utf8_wrappers.h lua-5.4.4-patched/src/utf8_wrappers.h diff -ruN lua-5.4.4\src\utf8_wrappers.h lua-5.4.4-patched\src\utf8_wrappers.h
--- lua-5.4.4/src/utf8_wrappers.h Thu Jan 01 08:00:00 1970 --- lua-5.4.4\src\utf8_wrappers.h Thu Jan 01 08:00:00 1970
+++ lua-5.4.4-patched/src/utf8_wrappers.h Wed Feb 22 18:09:48 2023 +++ lua-5.4.4-patched\src\utf8_wrappers.h Wed Feb 22 18:09:48 2023
@@ -0,0 +1,46 @@ @@ -0,0 +1,46 @@
+/** +/**
+ * Wrappers to provide Unicode (UTF-8) support on Windows. + * Wrappers to provide Unicode (UTF-8) support on Windows.

View File

@ -563,14 +563,13 @@ static int process_env_add(process_env_t *env_list, size_t *env_len, const char
} }
static void process_env_free(process_env_t *list) { static void process_env_free(process_env_t *list, size_t list_len) {
if (!*list) return; if (!*list) return;
#ifdef _WIN32 #ifndef _WIN32
free(*list); for (size_t i = 0; i < list_len; i++)
#else free((*list)[i]);
for (size_t i = 0; (*list)[i]; i++) free((*list)[i]);
free(*list);
#endif #endif
free(*list);
*list = NULL; *list = NULL;
} }
@ -833,7 +832,7 @@ static int process_start(lua_State* L) {
} }
} }
process_arglist_free(&arglist); process_arglist_free(&arglist);
process_env_free(&env_vars); process_env_free(&env_vars, env_vars_len);
if (retval == -1) if (retval == -1)
return lua_error(L); return lua_error(L);
@ -975,10 +974,7 @@ static int self_signal(lua_State* L, signal_e sig) {
static int f_terminate(lua_State* L) { return self_signal(L, SIGNAL_TERM); } static int f_terminate(lua_State* L) { return self_signal(L, SIGNAL_TERM); }
static int f_kill(lua_State* L) { return self_signal(L, SIGNAL_KILL); } static int f_kill(lua_State* L) { return self_signal(L, SIGNAL_KILL); }
static int f_interrupt(lua_State* L) { return self_signal(L, SIGNAL_INTERRUPT); } static int f_interrupt(lua_State* L) { return self_signal(L, SIGNAL_INTERRUPT); }
<<<<<<< HEAD
=======
>>>>>>> master
static int f_gc(lua_State* L) { static int f_gc(lua_State* L) {
process_kill_list_t *list = NULL; process_kill_list_t *list = NULL;
process_kill_t *p = NULL; process_kill_t *p = NULL;

View File

@ -90,7 +90,7 @@ static int f_font_load(lua_State *L) {
return ret_code; return ret_code;
RenFont** font = lua_newuserdata(L, sizeof(RenFont*)); RenFont** font = lua_newuserdata(L, sizeof(RenFont*));
*font = ren_font_load(window_renderer, filename, size, antialiasing, hinting, style); *font = ren_font_load(&window_renderer, filename, size, antialiasing, hinting, style);
if (!*font) if (!*font)
return luaL_error(L, "failed to load font"); return luaL_error(L, "failed to load font");
luaL_setmetatable(L, API_TYPE_FONT); luaL_setmetatable(L, API_TYPE_FONT);
@ -130,7 +130,7 @@ static int f_font_copy(lua_State *L) {
} }
for (int i = 0; i < FONT_FALLBACK_MAX && fonts[i]; ++i) { for (int i = 0; i < FONT_FALLBACK_MAX && fonts[i]; ++i) {
RenFont** font = lua_newuserdata(L, sizeof(RenFont*)); RenFont** font = lua_newuserdata(L, sizeof(RenFont*));
*font = ren_font_copy(window_renderer, fonts[i], size, antialiasing, hinting, style); *font = ren_font_copy(&window_renderer, fonts[i], size, antialiasing, hinting, style);
if (!*font) if (!*font)
return luaL_error(L, "failed to copy font"); return luaL_error(L, "failed to copy font");
luaL_setmetatable(L, API_TYPE_FONT); luaL_setmetatable(L, API_TYPE_FONT);
@ -198,7 +198,7 @@ static int f_font_get_width(lua_State *L) {
size_t len; size_t len;
const char *text = luaL_checklstring(L, 2, &len); const char *text = luaL_checklstring(L, 2, &len);
lua_pushnumber(L, ren_font_group_get_width(window_renderer, fonts, text, len, NULL)); lua_pushnumber(L, ren_font_group_get_width(&window_renderer, fonts, text, len, NULL));
return 1; return 1;
} }
@ -217,7 +217,7 @@ static int f_font_get_size(lua_State *L) {
static int f_font_set_size(lua_State *L) { static int f_font_set_size(lua_State *L) {
RenFont* fonts[FONT_FALLBACK_MAX]; font_retrieve(L, fonts, 1); RenFont* fonts[FONT_FALLBACK_MAX]; font_retrieve(L, fonts, 1);
float size = luaL_checknumber(L, 2); float size = luaL_checknumber(L, 2);
ren_font_group_set_size(window_renderer, fonts, size); ren_font_group_set_size(&window_renderer, fonts, size);
return 0; return 0;
} }
@ -276,7 +276,7 @@ static int f_show_debug(lua_State *L) {
static int f_get_size(lua_State *L) { static int f_get_size(lua_State *L) {
int w, h; int w, h;
ren_get_size(window_renderer, &w, &h); ren_get_size(&window_renderer, &w, &h);
lua_pushnumber(L, w); lua_pushnumber(L, w);
lua_pushnumber(L, h); lua_pushnumber(L, h);
return 2; return 2;
@ -284,13 +284,13 @@ static int f_get_size(lua_State *L) {
static int f_begin_frame(UNUSED lua_State *L) { static int f_begin_frame(UNUSED lua_State *L) {
rencache_begin_frame(window_renderer); rencache_begin_frame(&window_renderer);
return 0; return 0;
} }
static int f_end_frame(UNUSED lua_State *L) { static int f_end_frame(UNUSED lua_State *L) {
rencache_end_frame(window_renderer); rencache_end_frame(&window_renderer);
// clear the font reference table // clear the font reference table
lua_newtable(L); lua_newtable(L);
lua_rawseti(L, LUA_REGISTRYINDEX, RENDERER_FONT_REF); lua_rawseti(L, LUA_REGISTRYINDEX, RENDERER_FONT_REF);
@ -311,7 +311,7 @@ static int f_set_clip_rect(lua_State *L) {
lua_Number w = luaL_checknumber(L, 3); lua_Number w = luaL_checknumber(L, 3);
lua_Number h = luaL_checknumber(L, 4); lua_Number h = luaL_checknumber(L, 4);
RenRect rect = rect_to_grid(x, y, w, h); RenRect rect = rect_to_grid(x, y, w, h);
rencache_set_clip_rect(window_renderer, rect); rencache_set_clip_rect(&window_renderer, rect);
return 0; return 0;
} }
@ -323,7 +323,7 @@ static int f_draw_rect(lua_State *L) {
lua_Number h = luaL_checknumber(L, 4); lua_Number h = luaL_checknumber(L, 4);
RenRect rect = rect_to_grid(x, y, w, h); RenRect rect = rect_to_grid(x, y, w, h);
RenColor color = checkcolor(L, 5, 255); RenColor color = checkcolor(L, 5, 255);
rencache_draw_rect(window_renderer, rect, color); rencache_draw_rect(&window_renderer, rect, color);
return 0; return 0;
} }
@ -348,7 +348,7 @@ static int f_draw_text(lua_State *L) {
double x = luaL_checknumber(L, 3); double x = luaL_checknumber(L, 3);
int y = luaL_checknumber(L, 4); int y = luaL_checknumber(L, 4);
RenColor color = checkcolor(L, 5, 255); RenColor color = checkcolor(L, 5, 255);
x = rencache_draw_text(window_renderer, fonts, text, len, x, y, color); x = rencache_draw_text(&window_renderer, fonts, text, len, x, y, color);
lua_pushnumber(L, x); lua_pushnumber(L, x);
return 1; return 1;
} }

View File

@ -78,7 +78,7 @@ static SDL_HitTestResult SDLCALL hit_test(SDL_Window *window, const SDL_Point *p
const int controls_width = hit_info->controls_width; const int controls_width = hit_info->controls_width;
int w, h; int w, h;
SDL_GetWindowSize(window_renderer->window, &w, &h); SDL_GetWindowSize(window_renderer.window, &w, &h);
if (pt->y < hit_info->title_height && if (pt->y < hit_info->title_height &&
#if RESIZE_FROM_TOP #if RESIZE_FROM_TOP
@ -197,7 +197,7 @@ top:
case SDL_WINDOWEVENT: case SDL_WINDOWEVENT:
if (e.window.event == SDL_WINDOWEVENT_RESIZED) { if (e.window.event == SDL_WINDOWEVENT_RESIZED) {
ren_resize_window(window_renderer); ren_resize_window(&window_renderer);
lua_pushstring(L, "resized"); lua_pushstring(L, "resized");
/* The size below will be in points. */ /* The size below will be in points. */
lua_pushinteger(L, e.window.data1); lua_pushinteger(L, e.window.data1);
@ -236,8 +236,8 @@ top:
SDL_GetMouseState(&mx, &my); SDL_GetMouseState(&mx, &my);
lua_pushstring(L, "filedropped"); lua_pushstring(L, "filedropped");
lua_pushstring(L, e.drop.file); lua_pushstring(L, e.drop.file);
lua_pushinteger(L, mx * window_renderer->scale_x); lua_pushinteger(L, mx * window_renderer.scale_x);
lua_pushinteger(L, my * window_renderer->scale_y); lua_pushinteger(L, my * window_renderer.scale_y);
SDL_free(e.drop.file); SDL_free(e.drop.file);
return 4; return 4;
@ -294,8 +294,8 @@ top:
if (e.button.button == 1) { SDL_CaptureMouse(1); } if (e.button.button == 1) { SDL_CaptureMouse(1); }
lua_pushstring(L, "mousepressed"); lua_pushstring(L, "mousepressed");
lua_pushstring(L, button_name(e.button.button)); lua_pushstring(L, button_name(e.button.button));
lua_pushinteger(L, e.button.x * window_renderer->scale_x); lua_pushinteger(L, e.button.x * window_renderer.scale_x);
lua_pushinteger(L, e.button.y * window_renderer->scale_y); lua_pushinteger(L, e.button.y * window_renderer.scale_y);
lua_pushinteger(L, e.button.clicks); lua_pushinteger(L, e.button.clicks);
return 5; return 5;
@ -303,8 +303,8 @@ top:
if (e.button.button == 1) { SDL_CaptureMouse(0); } if (e.button.button == 1) { SDL_CaptureMouse(0); }
lua_pushstring(L, "mousereleased"); lua_pushstring(L, "mousereleased");
lua_pushstring(L, button_name(e.button.button)); lua_pushstring(L, button_name(e.button.button));
lua_pushinteger(L, e.button.x * window_renderer->scale_x); lua_pushinteger(L, e.button.x * window_renderer.scale_x);
lua_pushinteger(L, e.button.y * window_renderer->scale_y); lua_pushinteger(L, e.button.y * window_renderer.scale_y);
return 4; return 4;
case SDL_MOUSEMOTION: case SDL_MOUSEMOTION:
@ -316,10 +316,10 @@ top:
e.motion.yrel += event_plus.motion.yrel; e.motion.yrel += event_plus.motion.yrel;
} }
lua_pushstring(L, "mousemoved"); lua_pushstring(L, "mousemoved");
lua_pushinteger(L, e.motion.x * window_renderer->scale_x); lua_pushinteger(L, e.motion.x * window_renderer.scale_x);
lua_pushinteger(L, e.motion.y * window_renderer->scale_y); lua_pushinteger(L, e.motion.y * window_renderer.scale_y);
lua_pushinteger(L, e.motion.xrel * window_renderer->scale_x); lua_pushinteger(L, e.motion.xrel * window_renderer.scale_x);
lua_pushinteger(L, e.motion.yrel * window_renderer->scale_y); lua_pushinteger(L, e.motion.yrel * window_renderer.scale_y);
return 5; return 5;
case SDL_MOUSEWHEEL: case SDL_MOUSEWHEEL:
@ -335,7 +335,7 @@ top:
return 3; return 3;
case SDL_FINGERDOWN: case SDL_FINGERDOWN:
SDL_GetWindowSize(window_renderer->window, &w, &h); SDL_GetWindowSize(window_renderer.window, &w, &h);
lua_pushstring(L, "touchpressed"); lua_pushstring(L, "touchpressed");
lua_pushinteger(L, (lua_Integer)(e.tfinger.x * w)); lua_pushinteger(L, (lua_Integer)(e.tfinger.x * w));
@ -344,7 +344,7 @@ top:
return 4; return 4;
case SDL_FINGERUP: case SDL_FINGERUP:
SDL_GetWindowSize(window_renderer->window, &w, &h); SDL_GetWindowSize(window_renderer.window, &w, &h);
lua_pushstring(L, "touchreleased"); lua_pushstring(L, "touchreleased");
lua_pushinteger(L, (lua_Integer)(e.tfinger.x * w)); lua_pushinteger(L, (lua_Integer)(e.tfinger.x * w));
@ -360,7 +360,7 @@ top:
e.tfinger.dx += event_plus.tfinger.dx; e.tfinger.dx += event_plus.tfinger.dx;
e.tfinger.dy += event_plus.tfinger.dy; e.tfinger.dy += event_plus.tfinger.dy;
} }
SDL_GetWindowSize(window_renderer->window, &w, &h); SDL_GetWindowSize(window_renderer.window, &w, &h);
lua_pushstring(L, "touchmoved"); lua_pushstring(L, "touchmoved");
lua_pushinteger(L, (lua_Integer)(e.tfinger.x * w)); lua_pushinteger(L, (lua_Integer)(e.tfinger.x * w));
@ -440,7 +440,7 @@ static int f_set_cursor(lua_State *L) {
static int f_set_window_title(lua_State *L) { static int f_set_window_title(lua_State *L) {
const char *title = luaL_checkstring(L, 1); const char *title = luaL_checkstring(L, 1);
SDL_SetWindowTitle(window_renderer->window, title); SDL_SetWindowTitle(window_renderer.window, title);
return 0; return 0;
} }
@ -450,39 +450,39 @@ enum { WIN_NORMAL, WIN_MINIMIZED, WIN_MAXIMIZED, WIN_FULLSCREEN };
static int f_set_window_mode(lua_State *L) { static int f_set_window_mode(lua_State *L) {
int n = luaL_checkoption(L, 1, "normal", window_opts); int n = luaL_checkoption(L, 1, "normal", window_opts);
SDL_SetWindowFullscreen(window_renderer->window, SDL_SetWindowFullscreen(window_renderer.window,
n == WIN_FULLSCREEN ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0); n == WIN_FULLSCREEN ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
if (n == WIN_NORMAL) { SDL_RestoreWindow(window_renderer->window); } if (n == WIN_NORMAL) { SDL_RestoreWindow(window_renderer.window); }
if (n == WIN_MAXIMIZED) { SDL_MaximizeWindow(window_renderer->window); } if (n == WIN_MAXIMIZED) { SDL_MaximizeWindow(window_renderer.window); }
if (n == WIN_MINIMIZED) { SDL_MinimizeWindow(window_renderer->window); } if (n == WIN_MINIMIZED) { SDL_MinimizeWindow(window_renderer.window); }
return 0; return 0;
} }
static int f_set_window_bordered(lua_State *L) { static int f_set_window_bordered(lua_State *L) {
int bordered = lua_toboolean(L, 1); int bordered = lua_toboolean(L, 1);
SDL_SetWindowBordered(window_renderer->window, bordered); SDL_SetWindowBordered(window_renderer.window, bordered);
return 0; return 0;
} }
static int f_set_window_hit_test(lua_State *L) { static int f_set_window_hit_test(lua_State *L) {
if (lua_gettop(L) == 0) { if (lua_gettop(L) == 0) {
SDL_SetWindowHitTest(window_renderer->window, NULL, NULL); SDL_SetWindowHitTest(window_renderer.window, NULL, NULL);
return 0; return 0;
} }
window_hit_info->title_height = luaL_checknumber(L, 1); window_hit_info->title_height = luaL_checknumber(L, 1);
window_hit_info->controls_width = luaL_checknumber(L, 2); window_hit_info->controls_width = luaL_checknumber(L, 2);
window_hit_info->resize_border = luaL_checknumber(L, 3); window_hit_info->resize_border = luaL_checknumber(L, 3);
SDL_SetWindowHitTest(window_renderer->window, hit_test, window_hit_info); SDL_SetWindowHitTest(window_renderer.window, hit_test, window_hit_info);
return 0; return 0;
} }
static int f_get_window_size(lua_State *L) { static int f_get_window_size(lua_State *L) {
int x, y, w, h; int x, y, w, h;
SDL_GetWindowSize(window_renderer->window, &w, &h); SDL_GetWindowSize(window_renderer.window, &w, &h);
SDL_GetWindowPosition(window_renderer->window, &x, &y); SDL_GetWindowPosition(window_renderer.window, &x, &y);
lua_pushinteger(L, w); lua_pushinteger(L, w);
lua_pushinteger(L, h); lua_pushinteger(L, h);
lua_pushinteger(L, x); lua_pushinteger(L, x);
@ -496,22 +496,22 @@ static int f_set_window_size(lua_State *L) {
double h = luaL_checknumber(L, 2); double h = luaL_checknumber(L, 2);
double x = luaL_checknumber(L, 3); double x = luaL_checknumber(L, 3);
double y = luaL_checknumber(L, 4); double y = luaL_checknumber(L, 4);
SDL_SetWindowSize(window_renderer->window, w, h); SDL_SetWindowSize(window_renderer.window, w, h);
SDL_SetWindowPosition(window_renderer->window, x, y); SDL_SetWindowPosition(window_renderer.window, x, y);
ren_resize_window(window_renderer); ren_resize_window(&window_renderer);
return 0; return 0;
} }
static int f_window_has_focus(lua_State *L) { static int f_window_has_focus(lua_State *L) {
unsigned flags = SDL_GetWindowFlags(window_renderer->window); unsigned flags = SDL_GetWindowFlags(window_renderer.window);
lua_pushboolean(L, flags & SDL_WINDOW_INPUT_FOCUS); lua_pushboolean(L, flags & SDL_WINDOW_INPUT_FOCUS);
return 1; return 1;
} }
static int f_get_window_mode(lua_State *L) { static int f_get_window_mode(lua_State *L) {
unsigned flags = SDL_GetWindowFlags(window_renderer->window); unsigned flags = SDL_GetWindowFlags(window_renderer.window);
if (flags & SDL_WINDOW_FULLSCREEN_DESKTOP) { if (flags & SDL_WINDOW_FULLSCREEN_DESKTOP) {
lua_pushstring(L, "fullscreen"); lua_pushstring(L, "fullscreen");
} else if (flags & SDL_WINDOW_MINIMIZED) { } else if (flags & SDL_WINDOW_MINIMIZED) {
@ -549,8 +549,8 @@ static int f_raise_window(lua_State *L) {
to allow the window to be focused. Also on wayland the raise window event to allow the window to be focused. Also on wayland the raise window event
may not always be obeyed. may not always be obeyed.
*/ */
SDL_SetWindowInputFocus(window_renderer->window); SDL_SetWindowInputFocus(window_renderer.window);
SDL_RaiseWindow(window_renderer->window); SDL_RaiseWindow(window_renderer.window);
return 0; return 0;
} }
@ -931,7 +931,7 @@ static int f_fuzzy_match(lua_State *L) {
static int f_set_window_opacity(lua_State *L) { static int f_set_window_opacity(lua_State *L) {
double n = luaL_checknumber(L, 1); double n = luaL_checknumber(L, 1);
int r = SDL_SetWindowOpacity(window_renderer->window, n); int r = SDL_SetWindowOpacity(window_renderer.window, n);
lua_pushboolean(L, r > -1); lua_pushboolean(L, r > -1);
return 1; return 1;
} }

View File

@ -303,7 +303,7 @@ init_lua:
// This allows the window to be destroyed before lite-xl is done with // This allows the window to be destroyed before lite-xl is done with
// reaping child processes // reaping child processes
ren_free(window_renderer); ren_free_window_resources(&window_renderer);
lua_close(L); lua_close(L);
#if defined(__amigaos4__) #if defined(__amigaos4__)

View File

@ -22,7 +22,7 @@
#define MAX_LOADABLE_GLYPHSETS (MAX_UNICODE / GLYPHSET_SIZE) #define MAX_LOADABLE_GLYPHSETS (MAX_UNICODE / GLYPHSET_SIZE)
#define SUBPIXEL_BITMAPS_CACHED 3 #define SUBPIXEL_BITMAPS_CACHED 3
RenWindow* window_renderer = NULL; RenWindow window_renderer = {0};
static FT_Library library; static FT_Library library;
// draw_rect_surface is used as a 1x1 surface to simplify ren_draw_rect with blending // draw_rect_surface is used as a 1x1 surface to simplify ren_draw_rect with blending
@ -501,19 +501,26 @@ void ren_draw_rect(RenSurface *rs, RenRect rect, RenColor color) {
} }
/*************** Window Management ****************/ /*************** Window Management ****************/
RenWindow* ren_init(SDL_Window *win) { void ren_free_window_resources(RenWindow *window_renderer) {
renwin_free(window_renderer);
SDL_FreeSurface(draw_rect_surface);
free(window_renderer->command_buf);
window_renderer->command_buf = NULL;
window_renderer->command_buf_size = 0;
}
// TODO remove global and return RenWindow*
void ren_init(SDL_Window *win) {
assert(win); assert(win);
int error = FT_Init_FreeType( &library ); int error = FT_Init_FreeType( &library );
if ( error ) { if ( error ) {
fprintf(stderr, "internal font error when starting the application\n"); fprintf(stderr, "internal font error when starting the application\n");
return NULL; return NULL;
} }
RenWindow* window_renderer = malloc(sizeof(RenWindow)); window_renderer.window = win;
renwin_init_surface(&window_renderer);
window_renderer->window = win; renwin_init_command_buf(&window_renderer);
renwin_init_surface(window_renderer); renwin_clip_to_surface(&window_renderer);
renwin_init_command_buf(window_renderer);
renwin_clip_to_surface(window_renderer);
draw_rect_surface = SDL_CreateRGBSurface(0, 1, 1, 32, draw_rect_surface = SDL_CreateRGBSurface(0, 1, 1, 32,
0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF); 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF);
@ -536,6 +543,12 @@ void ren_resize_window(RenWindow *window_renderer) {
} }
void ren_resize_window(RenWindow *window_renderer) {
renwin_resize_surface(window_renderer);
renwin_update_scale(window_renderer);
}
void ren_update_rects(RenWindow *window_renderer, RenRect *rects, int count) { void ren_update_rects(RenWindow *window_renderer, RenRect *rects, int count) {
static bool initial_frame = true; static bool initial_frame = true;
if (initial_frame) { if (initial_frame) {

View File

@ -23,7 +23,7 @@ typedef struct { SDL_Surface *surface; int scale; } RenSurface;
struct RenWindow; struct RenWindow;
typedef struct RenWindow RenWindow; typedef struct RenWindow RenWindow;
extern RenWindow* window_renderer; extern RenWindow window_renderer;
RenFont* ren_font_load(RenWindow *window_renderer, const char *filename, float size, ERenFontAntialiasing antialiasing, ERenFontHinting hinting, unsigned char style); RenFont* ren_font_load(RenWindow *window_renderer, const char *filename, float size, ERenFontAntialiasing antialiasing, ERenFontHinting hinting, unsigned char style);
RenFont* ren_font_copy(RenWindow *window_renderer, RenFont* font, float size, ERenFontAntialiasing antialiasing, ERenFontHinting hinting, int style); RenFont* ren_font_copy(RenWindow *window_renderer, RenFont* font, float size, ERenFontAntialiasing antialiasing, ERenFontHinting hinting, int style);
@ -39,12 +39,12 @@ double ren_draw_text(RenSurface *rs, RenFont **font, const char *text, size_t le
void ren_draw_rect(RenSurface *rs, RenRect rect, RenColor color); void ren_draw_rect(RenSurface *rs, RenRect rect, RenColor color);
RenWindow* ren_init(SDL_Window *win); void ren_init(SDL_Window *win);
void ren_free(RenWindow* window_renderer);
void ren_resize_window(RenWindow *window_renderer); void ren_resize_window(RenWindow *window_renderer);
void ren_update_rects(RenWindow *window_renderer, RenRect *rects, int count); void ren_update_rects(RenWindow *window_renderer, RenRect *rects, int count);
void ren_set_clip_rect(RenWindow *window_renderer, RenRect rect); void ren_set_clip_rect(RenWindow *window_renderer, RenRect rect);
void ren_get_size(RenWindow *window_renderer, int *x, int *y); /* Reports the size in points. */ void ren_get_size(RenWindow *window_renderer, int *x, int *y); /* Reports the size in points. */
void ren_free_window_resources(RenWindow *window_renderer);
#endif #endif