Compare commits
9 Commits
amiga2.1
...
os4-v2.0.5
Author | SHA1 | Date |
---|---|---|
George Sokianos | 893fbfc43f | |
George Sokianos | f363c34499 | |
Francesco Abbate | 39f4ebe210 | |
Francesco Abbate | 86f2cefde8 | |
Francesco Abbate | 10d4f0a53a | |
Francesco Abbate | 96b7e68c67 | |
Francesco Abbate | de1db14d4a | |
Francesco Abbate | c9d4f6fab3 | |
Francesco Abbate | d1017895eb |
|
@ -19,3 +19,8 @@ compile_commands.json
|
|||
error.txt
|
||||
lite-xl*
|
||||
LiteXL*
|
||||
lite
|
||||
.config/
|
||||
*.lha
|
||||
release_files
|
||||
*.o
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
#
|
||||
# Project: Lite XL
|
||||
#
|
||||
# Created on: 26-12-2021
|
||||
#
|
||||
|
||||
LiteXL_OBJ := \
|
||||
src/dirmonitor.o src/fontdesc.o src/main.o src/rencache.o src/renderer.o \
|
||||
src/renwindow.o src/api/api.o src/api/cp_replace.o src/api/regex.o \
|
||||
src/api/renderer.o src/api/renderer_font.o src/api/system.o src/platform/amigaos4.o
|
||||
|
||||
|
||||
outfile := lite
|
||||
compiler := gcc
|
||||
cxxcompiler := g++
|
||||
|
||||
INCPATH := -Isrc -Ilib/dmon -Ilib/font_renderer -I/sdk/local/newlib/include/SDL2 -I/sdk/local/common/include/freetype2
|
||||
DFLAGS := -D__USE_INLINE__ -DLITE_XL_DATA_USE_EXEDIR
|
||||
# -DLITE_USE_SDL_RENDERER
|
||||
# -Wextra -Wall
|
||||
CFLAGS := -Werror -Wwrite-strings -O3 -g -std=gnu11 -fno-strict-aliasing
|
||||
# "-gstabs -finstrument-functions -fno-inline -DPROFILING"
|
||||
LFLAGS := -mcrt=newlib -static-libgcc -static-libstdc++ -lauto -lpcre2 -lSDL2 -llua -lfontrenderer -lagg -lfreetype -lm -lunix -lpthread -athread=native
|
||||
# " -lprofyle"
|
||||
|
||||
|
||||
|
||||
.PHONY: LiteXL clean release
|
||||
|
||||
default: LiteXL
|
||||
|
||||
clean:
|
||||
@echo "Cleaning compiler objects..."
|
||||
@rm -f $(LiteXL_OBJ)
|
||||
|
||||
LiteXL: $(LiteXL_OBJ)
|
||||
@echo "Linking LiteXL"
|
||||
@$(cxxcompiler) -o $(outfile) $(LiteXL_OBJ) $(LFLAGS)
|
||||
|
||||
|
||||
|
||||
.c.o:
|
||||
@echo "Compiling $<"
|
||||
@$(compiler) -c $< -o $*.o $(CFLAGS) $(INCPATH) $(DFLAGS)
|
||||
|
||||
src/dirmonitor.o: src/dirmonitor.c src/platform/amigaos4.h
|
||||
|
||||
src/main.o: src/main.c src/api/api.h src/rencache.h \
|
||||
src/renderer.h src/platform/amigaos4.h src/dirmonitor.h
|
||||
|
||||
src/rencache.o: src/rencache.c
|
||||
|
||||
src/renderer.o: src/renderer.c
|
||||
|
||||
src/renwindow.o: src/renwindow.c
|
||||
|
||||
src/api/api.o: src/api/api.c
|
||||
|
||||
src/api/regex.o: src/api/regex.c
|
||||
|
||||
src/api/renderer.o: src/api/renderer.c
|
||||
|
||||
src/api/system.o: src/api/system.c
|
||||
|
||||
src/platform/amigaos4.o: src/platform/amigaos4.c
|
||||
|
||||
|
||||
|
||||
|
||||
release:
|
||||
mkdir -p release/LiteXL
|
||||
cp release_files/* release/LiteXL/ -r
|
||||
mv release/LiteXL/LiteXL.info release/
|
||||
cp data release/LiteXL/ -r
|
||||
cp changelog.md release/LiteXL/
|
||||
cp lite release/LiteXL/
|
||||
strip release/LiteXL/lite
|
||||
cp README.md release/LiteXL/
|
||||
cp README_OS4.md release/LiteXL/
|
||||
cp LICENSE release/LiteXL/
|
||||
lha -aeqr3 a LiteXL.lha release/
|
||||
|
|
@ -0,0 +1,164 @@
|
|||
# Lite XL v2.0.5 for AmigaOS 4.1 FE
|
||||
|
||||
Lite XL is a lightweight text editor written in Lua.
|
||||
|
||||
## Installation
|
||||
You can extract the Lite XL archive wherever you want and run the *lite*
|
||||
editor.
|
||||
|
||||
## Configuration folder
|
||||
This editor creates a `.config` folder where the configuration is saved, as
|
||||
well as plugins, themes etc.. By default this AmigaOS 4.1 FE version uses the
|
||||
executable folder, but if you want to ovveride it, create an ENV variable
|
||||
named `HOME` and set there your path.
|
||||
|
||||
You can check if there is one already set by executing the following command
|
||||
in a shell
|
||||
```
|
||||
GetEnv HOME
|
||||
```
|
||||
If there is one set, then you will see the path at the output.
|
||||
|
||||
Otherwise, you can set your home path be executing the following command.
|
||||
Change the path to the one of your preference.
|
||||
```
|
||||
SetEnv SAVE HOME "Sys:home/"
|
||||
```
|
||||
|
||||
## Addons
|
||||
### Colors
|
||||
Colors are lua files that set the color scheme of the editor. There are
|
||||
light and dark themes for you to choose.
|
||||
|
||||
To install and use them you have to copy the ones you would like from
|
||||
`addons/colors/light` or `addons/colors/dark` into the folder
|
||||
`.config/lite-xl/colors/`. Don't add light or dark folders. Just copy the
|
||||
.lua files in there.
|
||||
|
||||
Then you have to start Lite XL and open your configuration by clicking
|
||||
at the cog icon at the toolbar (bottom left sixth icon). Go at the line
|
||||
that looks like below
|
||||
```
|
||||
-- core.reload_module("colors.summer")
|
||||
```
|
||||
and change the `summer` with the name of your color theme. Also, remove
|
||||
the two dashes `--` at the start of the line and save the file. If you
|
||||
did everything right, the color schema should change instantly.
|
||||
|
||||
The themes can also be found at
|
||||
https://github.com/lite-xl/lite-xl-colors
|
||||
|
||||
### Plugins
|
||||
The Lite XL that you are using on AmigaOS 4 is based on version 1.16.12
|
||||
and not the latest version that is available by the development team.
|
||||
This means that the latest plugins are not working at all or need some
|
||||
modifications to work.
|
||||
|
||||
To make it easier for you, I gathered some of the plugins that are working
|
||||
well, and I included them at the `addons/plugins`. For you to install the
|
||||
ones you would like to use, you have to copy the `.lua` files into the
|
||||
folder `.config/lite-xl/plugins/` and restart the editor.
|
||||
|
||||
The included plugins are the following:
|
||||
|
||||
**autoinsert**
|
||||
Automatically inserts closing brackets and quotes. Also allows selected
|
||||
text to be wrapped with brackets or quotes.
|
||||
|
||||
**autowrap**
|
||||
Automatically hardwraps lines when typing
|
||||
|
||||
**bigclock**
|
||||
Shows the current time and date in a view with large text
|
||||
|
||||
**bracketmatch**
|
||||
Underlines matching pair for bracket under the caret
|
||||
|
||||
**colorpreview**
|
||||
Underlays color values (eg. `#ff00ff` or `rgb(255, 0, 255)`) with their
|
||||
resultant color.
|
||||
|
||||
**eofnewline-xl**
|
||||
Make sure the file ends with one blank line.
|
||||
|
||||
**ephemeral_tabs**
|
||||
Preview tabs. Opening a doc will replace the contents of the preview tab.
|
||||
Marks tabs as non-preview on any change or tab double clicking.
|
||||
|
||||
**ghmarkdown**
|
||||
Opens a preview of the current markdown file in a browser window
|
||||
|
||||
**indentguide**
|
||||
Adds indent guides
|
||||
|
||||
**language_make**
|
||||
Syntax for the Make build system language
|
||||
|
||||
**language_sh**
|
||||
Syntax for shell scripting language
|
||||
|
||||
**lfautoinsert**
|
||||
Automatically inserts indentation and closing bracket/text after newline
|
||||
|
||||
**markers**
|
||||
Add markers to docs and jump between them quickly
|
||||
|
||||
**navigate**
|
||||
Allows moving back and forward between document positions, reducing the
|
||||
amount of scrolling
|
||||
|
||||
**rainbowparen**
|
||||
Show nesting of parentheses with rainbow colours
|
||||
|
||||
**restoretabs**
|
||||
Keep a list of recently closed tabs, and restore the tab in order on
|
||||
cntrl+shift+t.
|
||||
|
||||
**selectionhighlight**
|
||||
Highlights regions of code that match the current selection
|
||||
|
||||
## Tips and tricks
|
||||
|
||||
### Transitions
|
||||
|
||||
If you want to disable the transitions and make the scrolling a little faster,
|
||||
open your configuration by clicking at the cog icon at the toolbar
|
||||
(bottom left sixth icon) and add the followline at the end of the file and
|
||||
save it.
|
||||
|
||||
```
|
||||
config.transitions = false
|
||||
```
|
||||
|
||||
### Hide files from the file list
|
||||
|
||||
If you would like to hide files or whole folder from the left side bar list,
|
||||
open your configuration by clicking at the cog icon at the toolbar
|
||||
(bottom left sixth icon) and add the followline at the end of the file and
|
||||
save it. This hides all the files that start with a dot, and all the `.info`
|
||||
files.
|
||||
|
||||
```
|
||||
config.ignore_files = {"^%.", "%.info$"}
|
||||
```
|
||||
|
||||
You can add as many rules as you want in there, to hide fore files or
|
||||
folders, as you like.
|
||||
|
||||
|
||||
## Know issues
|
||||
You can find the known issues at
|
||||
https://git.walkero.gr/walkero/lite-xl/issues
|
||||
|
||||
|
||||
# Changelog
|
||||
|
||||
## [2.0.5r1] - 2022-03-27
|
||||
### Changed
|
||||
- Synced with v2.0.5 tag of lite-xl official github page
|
||||
- Applied all the necessary changes to make it run under AmigaOS 4.1 FE
|
||||
|
||||
## [2.0.3.1] - 2022-01-18
|
||||
### Changed
|
||||
- Applied all the necessary changes to make it run under AmigaOS 4.1 FE
|
||||
|
Binary file not shown.
|
@ -0,0 +1,28 @@
|
|||
local style = require "core.style"
|
||||
local common = require "core.common"
|
||||
|
||||
style.background = { common.color "#282828" }
|
||||
style.background2 = { common.color "#1d2021" }
|
||||
style.background3 = { common.color "#1d2021" }
|
||||
style.text = { common.color "#928374" }
|
||||
style.caret = { common.color "#fbf1c7" }
|
||||
style.accent = { common.color "#ebdbb2" }
|
||||
style.dim = { common.color "#928374" }
|
||||
style.divider = { common.color "#665c54" }
|
||||
style.selection = { common.color "#3c3836" }
|
||||
style.line_number = { common.color "#928374" }
|
||||
style.line_number2 = { common.color "#ebdbb2" }
|
||||
style.line_highlight = { common.color "#32302f" }
|
||||
style.scrollbar = { common.color "#928374" }
|
||||
style.scrollbar2 = { common.color "#fbf1c7" }
|
||||
|
||||
style.syntax["normal"] = { common.color "#ebdbb2" }
|
||||
style.syntax["symbol"] = { common.color "#ebdbb2" }
|
||||
style.syntax["comment"] = { common.color "#928374" }
|
||||
style.syntax["keyword"] = { common.color "#fb4934" }
|
||||
style.syntax["keyword2"] = { common.color "#83a598" }
|
||||
style.syntax["number"] = { common.color "#d3869b" }
|
||||
style.syntax["literal"] = { common.color "#d3869b" }
|
||||
style.syntax["string"] = { common.color "#b8bb26" }
|
||||
style.syntax["operator"] = { common.color "#ebdbb2" }
|
||||
style.syntax["function"] = { common.color "#8ec07c" }
|
|
@ -0,0 +1,31 @@
|
|||
-- Based on gruvbox color theme:
|
||||
-- https://github.com/morhetz/gruvbox
|
||||
|
||||
local style = require "core.style"
|
||||
local common = require "core.common"
|
||||
|
||||
style.background = { common.color "#fbf1c7" }
|
||||
style.background2 = { common.color "#f2e5bc" }
|
||||
style.background3 = { common.color "#eddbb2" }
|
||||
style.text = { common.color "#928374" }
|
||||
style.caret = { common.color "#282828" }
|
||||
style.accent = { common.color "#3c3836" }
|
||||
style.dim = { common.color "#928374" }
|
||||
style.divider = { common.color "#bdae93" }
|
||||
style.selection = { common.color "#ebdbb2" }
|
||||
style.line_number = { common.color "#928374" }
|
||||
style.line_number2 = { common.color "#3c3836" }
|
||||
style.line_highlight = { common.color "#f2e5bc" }
|
||||
style.scrollbar = { common.color "#928374" }
|
||||
style.scrollbar2 = { common.color "#504945" }
|
||||
|
||||
style.syntax["normal"] = { common.color "#3c3836" }
|
||||
style.syntax["symbol"] = { common.color "#3c3836" }
|
||||
style.syntax["comment"] = { common.color "#928374" }
|
||||
style.syntax["keyword"] = { common.color "#cc241d" }
|
||||
style.syntax["keyword2"] = { common.color "#458588" }
|
||||
style.syntax["number"] = { common.color "#b16286" }
|
||||
style.syntax["literal"] = { common.color "#b16286" }
|
||||
style.syntax["string"] = { common.color "#98971a" }
|
||||
style.syntax["operator"] = { common.color "#3c3836" }
|
||||
style.syntax["function"] = { common.color "#689d6a" }
|
|
@ -147,6 +147,12 @@ local function compile_ignore_files()
|
|||
end
|
||||
|
||||
|
||||
local function safe_match(s, pattern)
|
||||
local ok, match = pcall(string.match, s, pattern)
|
||||
return ok and match
|
||||
end
|
||||
|
||||
|
||||
local function fileinfo_pass_filter(info, ignore_compiled)
|
||||
if info.size >= config.file_size_limit * 1e6 then return false end
|
||||
local basename = common.basename(info.filename)
|
||||
|
@ -155,11 +161,11 @@ local function fileinfo_pass_filter(info, ignore_compiled)
|
|||
for _, compiled in ipairs(ignore_compiled) do
|
||||
local test = compiled.use_path and fullname or basename
|
||||
if compiled.match_dir then
|
||||
if info.type == "dir" and string.match(test .. "/", compiled.pattern) then
|
||||
if info.type == "dir" and safe_match(test .. "/", compiled.pattern) then
|
||||
return false
|
||||
end
|
||||
else
|
||||
if string.match(test, compiled.pattern) then
|
||||
if safe_match(test, compiled.pattern) then
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
@ -847,8 +853,9 @@ local function add_config_files_hooks()
|
|||
local doc_save = Doc.save
|
||||
local user_filename = system.absolute_path(USERDIR .. PATHSEP .. "init.lua")
|
||||
function Doc:save(filename, abs_filename)
|
||||
local module_filename = system.absolute_path(".lite_project.lua")
|
||||
doc_save(self, filename, abs_filename)
|
||||
if self.abs_filename == user_filename or self.abs_filename == core.project_module_filename then
|
||||
if self.abs_filename == user_filename or self.abs_filename == module_filename then
|
||||
reload_customizations()
|
||||
rescan_project_directories()
|
||||
configure_borderless_window()
|
||||
|
@ -964,7 +971,7 @@ function core.init()
|
|||
local plugins_success, plugins_refuse_list = core.load_plugins()
|
||||
|
||||
do
|
||||
local pdir, pname = project_dir_abs:match("(.*)[/\\\\](.*)")
|
||||
local pdir, pname = project_dir_abs:match("(.*)[:/\\\\](.*)")
|
||||
core.log("Opening project %q from directory %s", pname, pdir)
|
||||
end
|
||||
local got_project_error = not core.load_project_module()
|
||||
|
@ -1163,7 +1170,6 @@ end
|
|||
|
||||
function core.load_project_module()
|
||||
local filename = ".lite_project.lua"
|
||||
core.project_module_filename = system.absolute_path(filename)
|
||||
if system.get_file_info(filename) then
|
||||
return core.try(function()
|
||||
local fn, err = loadfile(filename)
|
||||
|
|
|
@ -6,9 +6,10 @@ keymap.map = {}
|
|||
keymap.reverse_map = {}
|
||||
|
||||
local macos = PLATFORM == "Mac OS X"
|
||||
local os4 = PLATFORM == "AmigaOS 4"
|
||||
|
||||
-- Thanks to mathewmariani, taken from his lite-macos github repository.
|
||||
local modkeys_os = require("core.modkeys-" .. (macos and "macos" or "generic"))
|
||||
local modkeys_os = require("core.modkeys-" .. (macos and "macos" or os4 and "os4" or "generic"))
|
||||
local modkey_map = modkeys_os.map
|
||||
local modkeys = modkeys_os.keys
|
||||
|
||||
|
|
|
@ -0,0 +1,15 @@
|
|||
local modkeys = {}
|
||||
|
||||
modkeys.map = {
|
||||
["left amiga"] = "cmd",
|
||||
["right amiga"] = "cmd",
|
||||
["control"] = "ctrl",
|
||||
["left shift"] = "shift",
|
||||
["right shift"] = "shift",
|
||||
["left alt"] = "alt",
|
||||
["right alt"] = "altgr",
|
||||
}
|
||||
|
||||
modkeys.keys = { "cmd", "ctrl", "alt", "altgr", "shift" }
|
||||
|
||||
return modkeys
|
|
@ -346,11 +346,20 @@ function Node:get_child_overlapping_point(x, y)
|
|||
end
|
||||
|
||||
|
||||
-- returns: total height, text padding, top margin
|
||||
local function get_tab_y_sizes()
|
||||
local h = style.font:get_height()
|
||||
local pad = style.padding.y
|
||||
local margin = style.divider_size -- top margin
|
||||
return h + 2 * pad + margin, pad, margin
|
||||
end
|
||||
|
||||
|
||||
function Node:get_scroll_button_rect(index)
|
||||
local w, pad = get_scroll_button_width()
|
||||
local h = style.font:get_height() + style.padding.y * 2
|
||||
local w, pad_x = get_scroll_button_width()
|
||||
local h = get_tab_y_sizes()
|
||||
local x = self.position.x + (index == 1 and 0 or self.size.x - w)
|
||||
return x, self.position.y, w, h, pad
|
||||
return x, self.position.y, w, h, pad_x
|
||||
end
|
||||
|
||||
|
||||
|
@ -360,8 +369,8 @@ function Node:get_tab_rect(idx)
|
|||
local x0 = self.position.x + sbw
|
||||
local x1 = x0 + common.clamp(self.tab_width * (idx - 1) - self.tab_shift, 0, maxw)
|
||||
local x2 = x0 + common.clamp(self.tab_width * idx - self.tab_shift, 0, maxw)
|
||||
local h = style.font:get_height() + style.padding.y * 2
|
||||
return x1, self.position.y, x2 - x1, h
|
||||
local h, pad_y, margin_y = get_tab_y_sizes()
|
||||
return x1, self.position.y, x2 - x1, h, margin_y
|
||||
end
|
||||
|
||||
|
||||
|
@ -520,22 +529,24 @@ function Node:draw_tab(text, is_active, is_hovered, is_close_hovered, x, y, w, h
|
|||
local ds = style.divider_size
|
||||
local dots_width = style.font:get_width("…")
|
||||
local color = style.dim
|
||||
local padding_y = style.padding.y
|
||||
local _, padding_y, margin_y = get_tab_y_sizes()
|
||||
renderer.draw_rect(x + w, y + padding_y, ds, h - padding_y * 2, style.dim)
|
||||
if standalone then
|
||||
renderer.draw_rect(x-1, y-1, w+2, h+2, style.background2)
|
||||
renderer.draw_rect(x-1, y + margin_y - 1, w+2, h - margin_y + 2, style.background2)
|
||||
end
|
||||
local y_label, h_label = y + margin_y, h - margin_y
|
||||
if is_active then
|
||||
color = style.text
|
||||
renderer.draw_rect(x, y, w, h, style.background)
|
||||
renderer.draw_rect(x + w, y, ds, h, style.divider)
|
||||
renderer.draw_rect(x - ds, y, ds, h, style.divider)
|
||||
renderer.draw_rect(x, y_label, w, h_label, style.background)
|
||||
renderer.draw_rect(x, y_label, w, ds, style.divider)
|
||||
renderer.draw_rect(x + w, y_label, ds, h_label, style.divider)
|
||||
renderer.draw_rect(x - ds, y_label, ds, h_label, style.divider)
|
||||
end
|
||||
local cx, cw, cspace = close_button_location(x, w)
|
||||
local show_close_button = ((is_active or is_hovered) and not standalone and config.tab_close_button)
|
||||
if show_close_button then
|
||||
local close_style = is_close_hovered and style.text or style.dim
|
||||
common.draw_text(style.icon_font, close_style, "C", nil, cx, y, 0, h)
|
||||
common.draw_text(style.icon_font, close_style, "C", nil, cx, y_label, 0, h_label)
|
||||
end
|
||||
if is_hovered then
|
||||
color = style.text
|
||||
|
@ -560,7 +571,7 @@ function Node:draw_tab(text, is_active, is_hovered, is_close_hovered, x, y, w, h
|
|||
end
|
||||
end
|
||||
end
|
||||
common.draw_text(style.font, color, text, align, x, y, w, h)
|
||||
common.draw_text(style.font, color, text, align, x, y_label, w, h_label)
|
||||
core.pop_clip_rect()
|
||||
end
|
||||
|
||||
|
@ -760,7 +771,7 @@ function Node:get_drag_overlay_tab_position(x, y, dragged_node, dragged_index)
|
|||
tab_index = self:get_visible_tabs_number() + (self.tab_offset - 1 or 0)
|
||||
end
|
||||
end
|
||||
local tab_x, tab_y, tab_w, tab_h = self:get_tab_rect(tab_index)
|
||||
local tab_x, tab_y, tab_w, tab_h, margin_y = self:get_tab_rect(tab_index)
|
||||
if x > tab_x + tab_w / 2 and tab_index <= #self.views then
|
||||
-- use next tab
|
||||
tab_x = tab_x + tab_w
|
||||
|
@ -771,7 +782,7 @@ function Node:get_drag_overlay_tab_position(x, y, dragged_node, dragged_index)
|
|||
tab_index = tab_index - 1
|
||||
tab_x = tab_x - tab_w
|
||||
end
|
||||
return tab_index, tab_x, tab_y, tab_w, tab_h
|
||||
return tab_index, tab_x, tab_y + margin_y, tab_w, tab_h - margin_y
|
||||
end
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
-- this file is used by lite-xl to setup the Lua environment when starting
|
||||
VERSION = "@PROJECT_VERSION@"
|
||||
VERSION = "2.0.5"
|
||||
MOD_VERSION = "2"
|
||||
|
||||
SCALE = tonumber(os.getenv("LITE_SCALE")) or SCALE
|
||||
|
|
|
@ -146,6 +146,9 @@ DMON_API_DECL void dmon_unwatch(dmon_watch_id id);
|
|||
#elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
|
||||
# undef DMON_OS_MACOS
|
||||
# define DMON_OS_MACOS __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
|
||||
#elif defined(__amigaos4__)
|
||||
# undef DMON_OS_AMIGAOS4
|
||||
# define DMON_OS_AMIGAOS4 1
|
||||
#else
|
||||
# define DMON_OS 0
|
||||
# error "unsupported platform"
|
||||
|
@ -159,10 +162,6 @@ DMON_API_DECL void dmon_unwatch(dmon_watch_id id);
|
|||
# define NOMINMAX
|
||||
# endif
|
||||
# include <windows.h>
|
||||
# include <intrin.h>
|
||||
# ifdef _MSC_VER
|
||||
# pragma intrinsic(_InterlockedExchange)
|
||||
# endif
|
||||
#elif DMON_OS_LINUX
|
||||
# ifndef __USE_MISC
|
||||
# define __USE_MISC
|
||||
|
@ -187,6 +186,7 @@ DMON_API_DECL void dmon_unwatch(dmon_watch_id id);
|
|||
# include <sys/time.h>
|
||||
# include <sys/stat.h>
|
||||
# include <dispatch/dispatch.h>
|
||||
#elif DMON_OS_AMIGAOS4
|
||||
#endif
|
||||
|
||||
#ifndef DMON_MALLOC
|
||||
|
@ -406,7 +406,8 @@ typedef struct dmon__state {
|
|||
dmon__watch_state watches[DMON_MAX_WATCHES];
|
||||
HANDLE thread_handle;
|
||||
CRITICAL_SECTION mutex;
|
||||
volatile LONG modify_watches;
|
||||
volatile int modify_watches;
|
||||
CRITICAL_SECTION modify_watches_mutex;
|
||||
dmon__win32_event* events;
|
||||
bool quit;
|
||||
HANDLE wake_event;
|
||||
|
@ -492,6 +493,13 @@ _DMON_PRIVATE void dmon__win32_process_events(void)
|
|||
stb_sb_reset(_dmon.events);
|
||||
}
|
||||
|
||||
static int dmon__safe_get_modify_watches() {
|
||||
EnterCriticalSection(&_dmon.modify_watches_mutex);
|
||||
const int value = _dmon.modify_watches;
|
||||
LeaveCriticalSection(&_dmon.modify_watches_mutex);
|
||||
return value;
|
||||
}
|
||||
|
||||
_DMON_PRIVATE DWORD WINAPI dmon__thread(LPVOID arg)
|
||||
{
|
||||
_DMON_UNUSED(arg);
|
||||
|
@ -502,7 +510,8 @@ _DMON_PRIVATE DWORD WINAPI dmon__thread(LPVOID arg)
|
|||
uint64_t msecs_elapsed = 0;
|
||||
|
||||
while (!_dmon.quit) {
|
||||
if (_dmon.modify_watches || !TryEnterCriticalSection(&_dmon.mutex)) {
|
||||
if (dmon__safe_get_modify_watches() ||
|
||||
!TryEnterCriticalSection(&_dmon.mutex)) {
|
||||
Sleep(10);
|
||||
continue;
|
||||
}
|
||||
|
@ -587,6 +596,7 @@ DMON_API_IMPL void dmon_init(void)
|
|||
{
|
||||
DMON_ASSERT(!_dmon_init);
|
||||
InitializeCriticalSection(&_dmon.mutex);
|
||||
InitializeCriticalSection(&_dmon.modify_watches_mutex);
|
||||
|
||||
_dmon.thread_handle =
|
||||
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)dmon__thread, NULL, 0, NULL);
|
||||
|
@ -596,11 +606,20 @@ DMON_API_IMPL void dmon_init(void)
|
|||
}
|
||||
|
||||
static void dmon__enter_critical_wakeup(void) {
|
||||
_InterlockedExchange(&_dmon.modify_watches, 1);
|
||||
EnterCriticalSection(&_dmon.modify_watches_mutex);
|
||||
_dmon.modify_watches = 1;
|
||||
if (TryEnterCriticalSection(&_dmon.mutex) == 0) {
|
||||
SetEvent(_dmon.wake_event);
|
||||
EnterCriticalSection(&_dmon.mutex);
|
||||
}
|
||||
LeaveCriticalSection(&_dmon.modify_watches_mutex);
|
||||
}
|
||||
|
||||
static void dmon__leave_critical_wakeup(void) {
|
||||
EnterCriticalSection(&_dmon.modify_watches_mutex);
|
||||
_dmon.modify_watches = 0;
|
||||
LeaveCriticalSection(&_dmon.modify_watches_mutex);
|
||||
LeaveCriticalSection(&_dmon.mutex);
|
||||
}
|
||||
|
||||
DMON_API_IMPL void dmon_deinit(void)
|
||||
|
@ -617,8 +636,9 @@ DMON_API_IMPL void dmon_deinit(void)
|
|||
dmon__unwatch(&_dmon.watches[i]);
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&_dmon.mutex);
|
||||
dmon__leave_critical_wakeup();
|
||||
DeleteCriticalSection(&_dmon.mutex);
|
||||
DeleteCriticalSection(&_dmon.modify_watches_mutex);
|
||||
stb_sb_free(_dmon.events);
|
||||
_dmon_init = false;
|
||||
}
|
||||
|
@ -665,19 +685,16 @@ DMON_API_IMPL dmon_watch_id dmon_watch(const char* rootdir,
|
|||
!dmon__refresh_watch(watch)) {
|
||||
dmon__unwatch(watch);
|
||||
*error_code = DMON_ERROR_WATCH_DIR;
|
||||
LeaveCriticalSection(&_dmon.mutex);
|
||||
_InterlockedExchange(&_dmon.modify_watches, 0);
|
||||
dmon__leave_critical_wakeup();
|
||||
return dmon__make_id(0);
|
||||
}
|
||||
} else {
|
||||
*error_code = DMON_ERROR_OPEN_DIR;
|
||||
LeaveCriticalSection(&_dmon.mutex);
|
||||
_InterlockedExchange(&_dmon.modify_watches, 0);
|
||||
dmon__leave_critical_wakeup();
|
||||
return dmon__make_id(0);
|
||||
}
|
||||
|
||||
LeaveCriticalSection(&_dmon.mutex);
|
||||
_InterlockedExchange(&_dmon.modify_watches, 0);
|
||||
dmon__leave_critical_wakeup();
|
||||
return dmon__make_id(id);
|
||||
}
|
||||
|
||||
|
@ -696,8 +713,7 @@ DMON_API_IMPL void dmon_unwatch(dmon_watch_id id)
|
|||
}
|
||||
--_dmon.num_watches;
|
||||
|
||||
LeaveCriticalSection(&_dmon.mutex);
|
||||
_InterlockedExchange(&_dmon.modify_watches, 0);
|
||||
dmon__leave_critical_wakeup();
|
||||
}
|
||||
|
||||
#elif DMON_OS_LINUX
|
||||
|
@ -733,7 +749,8 @@ typedef struct dmon__state {
|
|||
int num_watches;
|
||||
pthread_t thread_handle;
|
||||
pthread_mutex_t mutex;
|
||||
int wait_flag;
|
||||
volatile int wait_flag;
|
||||
pthread_mutex_t wait_flag_mutex;
|
||||
int wake_event_pipe[2];
|
||||
bool quit;
|
||||
} dmon__state;
|
||||
|
@ -941,7 +958,7 @@ _DMON_PRIVATE void dmon__inotify_process_events(void)
|
|||
if ((check_ev->mask & IN_MODIFY) && strcmp(ev->filepath, check_ev->filepath) == 0) {
|
||||
check_ev->skip = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1013,6 +1030,13 @@ _DMON_PRIVATE void dmon__inotify_process_events(void)
|
|||
stb_sb_reset(_dmon.events);
|
||||
}
|
||||
|
||||
_DMON_PRIVATE int dmon__safe_get_wait_flag() {
|
||||
pthread_mutex_lock(&_dmon.wait_flag_mutex);
|
||||
const int value = _dmon.wait_flag;
|
||||
pthread_mutex_unlock(&_dmon.wait_flag_mutex);
|
||||
return value;
|
||||
}
|
||||
|
||||
static void* dmon__thread(void* arg)
|
||||
{
|
||||
_DMON_UNUSED(arg);
|
||||
|
@ -1028,7 +1052,9 @@ static void* dmon__thread(void* arg)
|
|||
|
||||
while (!_dmon.quit) {
|
||||
nanosleep(&req, &rem);
|
||||
if (_dmon.num_watches == 0 || _dmon.wait_flag == 1 || pthread_mutex_trylock(&_dmon.mutex) != 0) {
|
||||
if (_dmon.num_watches == 0 ||
|
||||
dmon__safe_get_wait_flag() ||
|
||||
pthread_mutex_trylock(&_dmon.mutex) != 0) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -1106,6 +1132,7 @@ static void* dmon__thread(void* arg)
|
|||
}
|
||||
|
||||
_DMON_PRIVATE void dmon__mutex_wakeup_lock(void) {
|
||||
pthread_mutex_lock(&_dmon.wait_flag_mutex);
|
||||
_dmon.wait_flag = 1;
|
||||
if (pthread_mutex_trylock(&_dmon.mutex) != 0) {
|
||||
char send_char = 1;
|
||||
|
@ -1113,6 +1140,7 @@ _DMON_PRIVATE void dmon__mutex_wakeup_lock(void) {
|
|||
pthread_mutex_lock(&_dmon.mutex);
|
||||
}
|
||||
_dmon.wait_flag = 0;
|
||||
pthread_mutex_unlock(&_dmon.wait_flag_mutex);
|
||||
}
|
||||
|
||||
_DMON_PRIVATE void dmon__unwatch(dmon__watch_state* watch)
|
||||
|
|
|
@ -0,0 +1,14 @@
|
|||
#!/bin/bash
|
||||
|
||||
cxxcompiler="c++"
|
||||
cxxflags="-Wall -O3 -g -std=c++03 -fno-exceptions -fno-rtti -Isrc -Ilib/font_renderer -DFONT_RENDERER_HEIGHT_HACK -lagg -lfreetype -I/sdk/local/common/include/agg -I/sdk/local/common/include/freetype2"
|
||||
|
||||
echo "compiling font renderer library..."
|
||||
|
||||
c++ -c $cxxflags agg_font_freetype.cpp -o agg_font_freetype.o
|
||||
c++ -c $cxxflags font_renderer.cpp -o font_renderer.o
|
||||
|
||||
ar -rcs libfontrenderer.a *.o
|
||||
|
||||
rm *.o
|
||||
echo "font renderer library created"
|
|
@ -1,88 +1,88 @@
|
|||
#define MyAppName "Lite XL"
|
||||
#define MyAppVersion "@PROJECT_VERSION@"
|
||||
#define MyAppPublisher "Lite XL Team"
|
||||
#define MyAppURL "https://lite-xl.github.io"
|
||||
#define MyAppExeName "lite-xl.exe"
|
||||
#define BuildDir "@PROJECT_BUILD_DIR@"
|
||||
#define SourceDir "@PROJECT_SOURCE_DIR@"
|
||||
|
||||
; Use /dArch option to create a setup for a different architecture, e.g.:
|
||||
; iscc /dArch=x86 innosetup.iss
|
||||
#ifndef Arch
|
||||
#define Arch "x64"
|
||||
#endif
|
||||
|
||||
[Setup]
|
||||
; NOTE: The value of AppId uniquely identifies this application.
|
||||
; Do not use the same AppId value in installers for other applications.
|
||||
; To generate a new GUID, click Tools | Generate GUID inside the InnoSetup IDE.
|
||||
AppId={{06761240-D97C-43DE-B9ED-C15F765A2D65}
|
||||
|
||||
AppName={#MyAppName}
|
||||
AppVersion={#MyAppVersion}
|
||||
;AppVerName={#MyAppName} {#MyAppVersion}
|
||||
AppPublisher={#MyAppPublisher}
|
||||
AppPublisherURL={#MyAppURL}
|
||||
AppSupportURL={#MyAppURL}
|
||||
AppUpdatesURL={#MyAppURL}
|
||||
|
||||
#if Arch=="x64"
|
||||
ArchitecturesAllowed=x64
|
||||
ArchitecturesInstallIn64BitMode=x64
|
||||
#define ArchInternal "x86_64"
|
||||
#else
|
||||
#define ArchInternal "i686"
|
||||
#endif
|
||||
|
||||
AllowNoIcons=yes
|
||||
Compression=lzma
|
||||
SolidCompression=yes
|
||||
DefaultDirName={autopf}/{#MyAppName}
|
||||
DefaultGroupName={#MyAppPublisher}
|
||||
UninstallFilesDir={app}
|
||||
|
||||
; Uncomment the following line to run in non administrative install mode
|
||||
; (install for current user only.)
|
||||
;PrivilegesRequired=lowest
|
||||
PrivilegesRequiredOverridesAllowed=dialog
|
||||
|
||||
; The [Icons] "quicklaunchicon" entry uses {userappdata}
|
||||
; but its [Tasks] entry has a proper IsAdminInstallMode Check.
|
||||
UsedUserAreasWarning=no
|
||||
|
||||
OutputDir=.
|
||||
OutputBaseFilename=LiteXL-{#MyAppVersion}-{#ArchInternal}-setup
|
||||
;DisableDirPage=yes
|
||||
;DisableProgramGroupPage=yes
|
||||
|
||||
LicenseFile={#SourceDir}/LICENSE
|
||||
SetupIconFile={#SourceDir}/resources/icons/icon.ico
|
||||
WizardImageFile="{#SourceDir}/scripts/innosetup/wizard-modern-image.bmp"
|
||||
WizardSmallImageFile="{#SourceDir}/scripts/innosetup/litexl-55px.bmp"
|
||||
|
||||
[Languages]
|
||||
Name: "english"; MessagesFile: "compiler:Default.isl"
|
||||
|
||||
[Tasks]
|
||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 6.1; Check: not IsAdminInstallMode
|
||||
Name: "portablemode"; Description: "Portable Mode"; Flags: unchecked
|
||||
|
||||
[Files]
|
||||
Source: "{#BuildDir}/src/lite-xl.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "{#BuildDir}/mingwLibs{#Arch}/*"; DestDir: "{app}"; Flags: ignoreversion ; Check: DirExists(ExpandConstant('{#BuildDir}/mingwLibs{#Arch}'))
|
||||
Source: "{#SourceDir}/data/*"; DestDir: "{app}/data"; Flags: ignoreversion recursesubdirs
|
||||
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
||||
|
||||
[Icons]
|
||||
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
|
||||
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Check: not WizardIsTaskSelected('portablemode')
|
||||
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Check: not WizardIsTaskSelected('portablemode')
|
||||
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon; Check: not WizardIsTaskSelected('portablemode')
|
||||
; Name: "{usersendto}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
|
||||
|
||||
[Run]
|
||||
Filename: "{app}/{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
|
||||
|
||||
[Setup]
|
||||
Uninstallable=not WizardIsTaskSelected('portablemode')
|
||||
#define MyAppName "Lite XL"
|
||||
#define MyAppVersion "@PROJECT_VERSION@"
|
||||
#define MyAppPublisher "Lite XL Team"
|
||||
#define MyAppURL "https://lite-xl.github.io"
|
||||
#define MyAppExeName "lite-xl.exe"
|
||||
#define BuildDir "@PROJECT_BUILD_DIR@"
|
||||
#define SourceDir "@PROJECT_SOURCE_DIR@"
|
||||
|
||||
; Use /dArch option to create a setup for a different architecture, e.g.:
|
||||
; iscc /dArch=x86 innosetup.iss
|
||||
#ifndef Arch
|
||||
#define Arch "x64"
|
||||
#endif
|
||||
|
||||
[Setup]
|
||||
; NOTE: The value of AppId uniquely identifies this application.
|
||||
; Do not use the same AppId value in installers for other applications.
|
||||
; To generate a new GUID, click Tools | Generate GUID inside the InnoSetup IDE.
|
||||
AppId={{06761240-D97C-43DE-B9ED-C15F765A2D65}
|
||||
|
||||
AppName={#MyAppName}
|
||||
AppVersion={#MyAppVersion}
|
||||
;AppVerName={#MyAppName} {#MyAppVersion}
|
||||
AppPublisher={#MyAppPublisher}
|
||||
AppPublisherURL={#MyAppURL}
|
||||
AppSupportURL={#MyAppURL}
|
||||
AppUpdatesURL={#MyAppURL}
|
||||
|
||||
#if Arch=="x64"
|
||||
ArchitecturesAllowed=x64
|
||||
ArchitecturesInstallIn64BitMode=x64
|
||||
#define ArchInternal "x86_64"
|
||||
#else
|
||||
#define ArchInternal "i686"
|
||||
#endif
|
||||
|
||||
AllowNoIcons=yes
|
||||
Compression=lzma
|
||||
SolidCompression=yes
|
||||
DefaultDirName={autopf}/{#MyAppName}
|
||||
DefaultGroupName={#MyAppPublisher}
|
||||
UninstallFilesDir={app}
|
||||
|
||||
; Uncomment the following line to run in non administrative install mode
|
||||
; (install for current user only.)
|
||||
;PrivilegesRequired=lowest
|
||||
PrivilegesRequiredOverridesAllowed=dialog
|
||||
|
||||
; The [Icons] "quicklaunchicon" entry uses {userappdata}
|
||||
; but its [Tasks] entry has a proper IsAdminInstallMode Check.
|
||||
UsedUserAreasWarning=no
|
||||
|
||||
OutputDir=.
|
||||
OutputBaseFilename=LiteXL-{#MyAppVersion}-{#ArchInternal}-setup
|
||||
;DisableDirPage=yes
|
||||
;DisableProgramGroupPage=yes
|
||||
|
||||
LicenseFile={#SourceDir}/LICENSE
|
||||
SetupIconFile={#SourceDir}/resources/icons/icon.ico
|
||||
WizardImageFile="{#SourceDir}/scripts/innosetup/wizard-modern-image.bmp"
|
||||
WizardSmallImageFile="{#SourceDir}/scripts/innosetup/litexl-55px.bmp"
|
||||
|
||||
[Languages]
|
||||
Name: "english"; MessagesFile: "compiler:Default.isl"
|
||||
|
||||
[Tasks]
|
||||
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
|
||||
Name: "quicklaunchicon"; Description: "{cm:CreateQuickLaunchIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked; OnlyBelowVersion: 6.1; Check: not IsAdminInstallMode
|
||||
Name: "portablemode"; Description: "Portable Mode"; Flags: unchecked
|
||||
|
||||
[Files]
|
||||
Source: "{#BuildDir}/src/lite-xl.exe"; DestDir: "{app}"; Flags: ignoreversion
|
||||
Source: "{#BuildDir}/mingwLibs{#Arch}/*"; DestDir: "{app}"; Flags: ignoreversion ; Check: DirExists(ExpandConstant('{#BuildDir}/mingwLibs{#Arch}'))
|
||||
Source: "{#SourceDir}/data/*"; DestDir: "{app}/data"; Flags: ignoreversion recursesubdirs
|
||||
; NOTE: Don't use "Flags: ignoreversion" on any shared system files
|
||||
|
||||
[Icons]
|
||||
Name: "{autodesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon
|
||||
Name: "{group}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Check: not WizardIsTaskSelected('portablemode')
|
||||
Name: "{group}\{cm:UninstallProgram,{#MyAppName}}"; Filename: "{uninstallexe}"; Check: not WizardIsTaskSelected('portablemode')
|
||||
Name: "{userappdata}\Microsoft\Internet Explorer\Quick Launch\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: quicklaunchicon; Check: not WizardIsTaskSelected('portablemode')
|
||||
; Name: "{usersendto}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"
|
||||
|
||||
[Run]
|
||||
Filename: "{app}/{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
|
||||
|
||||
[Setup]
|
||||
Uninstallable=not WizardIsTaskSelected('portablemode')
|
||||
|
|
|
@ -216,11 +216,11 @@ main() {
|
|||
rm -rf "Lite XL.app"; mv "${dest_dir}" "Lite XL.app"
|
||||
dest_dir="Lite XL.app"
|
||||
exe_file="$(pwd)/${dest_dir}/Contents/MacOS/lite-xl"
|
||||
data_dir="$(pwd)/${dest_dir}/Contents/Resources"
|
||||
fi
|
||||
fi
|
||||
|
||||
if [[ $bundle == false && $portable == false ]]; then
|
||||
echo "Creating a compressed archive..."
|
||||
data_dir="$(pwd)/${dest_dir}/$prefix/share/lite-xl"
|
||||
exe_file="$(pwd)/${dest_dir}/$prefix/bin/lite-xl"
|
||||
fi
|
||||
|
@ -240,6 +240,7 @@ main() {
|
|||
|
||||
$stripcmd "${exe_file}"
|
||||
|
||||
echo "Creating a compressed archive ${package_name}"
|
||||
if [[ $binary == true ]]; then
|
||||
rm -f "${package_name}".tar.gz
|
||||
rm -f "${package_name}".zip
|
||||
|
|
|
@ -4,14 +4,14 @@
|
|||
int luaopen_system(lua_State *L);
|
||||
int luaopen_renderer(lua_State *L);
|
||||
int luaopen_regex(lua_State *L);
|
||||
int luaopen_process(lua_State *L);
|
||||
// int luaopen_process(lua_State *L);
|
||||
|
||||
|
||||
static const luaL_Reg libs[] = {
|
||||
{ "system", luaopen_system },
|
||||
{ "renderer", luaopen_renderer },
|
||||
{ "regex", luaopen_regex },
|
||||
{ "process", luaopen_process },
|
||||
// { "process", luaopen_process },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
#include <errno.h>
|
||||
#include <sys/stat.h>
|
||||
#include "api.h"
|
||||
#include "dirmonitor.h"
|
||||
// #include "dirmonitor.h"
|
||||
#include "rencache.h"
|
||||
#ifdef _WIN32
|
||||
#include <direct.h>
|
||||
|
@ -14,6 +14,8 @@
|
|||
#include <fileapi.h>
|
||||
#elif __linux__
|
||||
#include <sys/vfs.h>
|
||||
#elif __amigaos4__
|
||||
#include "platform/amigaos4.h"
|
||||
#endif
|
||||
|
||||
extern SDL_Window *window;
|
||||
|
@ -242,19 +244,19 @@ top:
|
|||
case SDL_USEREVENT:
|
||||
lua_pushstring(L, "dirchange");
|
||||
lua_pushnumber(L, e.user.code >> 16);
|
||||
switch (e.user.code & 0xffff) {
|
||||
case DMON_ACTION_DELETE:
|
||||
lua_pushstring(L, "delete");
|
||||
break;
|
||||
case DMON_ACTION_CREATE:
|
||||
lua_pushstring(L, "create");
|
||||
break;
|
||||
case DMON_ACTION_MODIFY:
|
||||
lua_pushstring(L, "modify");
|
||||
break;
|
||||
default:
|
||||
return luaL_error(L, "unknown dmon event action: %d", e.user.code & 0xffff);
|
||||
}
|
||||
// switch (e.user.code & 0xffff) {
|
||||
// case DMON_ACTION_DELETE:
|
||||
// lua_pushstring(L, "delete");
|
||||
// break;
|
||||
// case DMON_ACTION_CREATE:
|
||||
// lua_pushstring(L, "create");
|
||||
// break;
|
||||
// case DMON_ACTION_MODIFY:
|
||||
// lua_pushstring(L, "modify");
|
||||
// break;
|
||||
// default:
|
||||
// return luaL_error(L, "unknown dmon event action: %d", e.user.code & 0xffff);
|
||||
// }
|
||||
lua_pushstring(L, e.user.data1);
|
||||
free(e.user.data1);
|
||||
return 4;
|
||||
|
@ -325,7 +327,11 @@ static int f_set_window_mode(lua_State *L) {
|
|||
int n = luaL_checkoption(L, 1, "normal", window_opts);
|
||||
SDL_SetWindowFullscreen(window,
|
||||
n == WIN_FULLSCREEN ? SDL_WINDOW_FULLSCREEN_DESKTOP : 0);
|
||||
if (n == WIN_NORMAL) { SDL_RestoreWindow(window); }
|
||||
if (n == WIN_NORMAL)
|
||||
{
|
||||
ren_resize_window();
|
||||
SDL_RestoreWindow(window);
|
||||
}
|
||||
if (n == WIN_MAXIMIZED) { SDL_MaximizeWindow(window); }
|
||||
if (n == WIN_MINIMIZED) { SDL_MinimizeWindow(window); }
|
||||
return 0;
|
||||
|
@ -507,6 +513,10 @@ static int f_list_dir(lua_State *L) {
|
|||
#define realpath(x, y) _fullpath(y, x, MAX_PATH)
|
||||
#endif
|
||||
|
||||
#ifdef __amigaos4__
|
||||
#define realpath(x, y) _fullpath(x)
|
||||
#endif
|
||||
|
||||
static int f_absolute_path(lua_State *L) {
|
||||
const char *path = luaL_checkstring(L, 1);
|
||||
char *res = realpath(path, NULL);
|
||||
|
@ -735,24 +745,27 @@ static int f_watch_dir(lua_State *L) {
|
|||
const uint32_t dmon_flags = DMON_WATCHFLAGS_FOLLOW_SYMLINKS;
|
||||
#elif __APPLE__
|
||||
const uint32_t dmon_flags = DMON_WATCHFLAGS_FOLLOW_SYMLINKS | DMON_WATCHFLAGS_RECURSIVE;
|
||||
#elif __amigaos4__
|
||||
// const uint32_t dmon_flags = 0;
|
||||
#else
|
||||
const uint32_t dmon_flags = DMON_WATCHFLAGS_RECURSIVE;
|
||||
#endif
|
||||
dmon_error error;
|
||||
dmon_watch_id watch_id = dmon_watch(path, dirmonitor_watch_callback, dmon_flags, NULL, &error);
|
||||
if (watch_id.id == 0) {
|
||||
lua_pushnil(L);
|
||||
lua_pushstring(L, dmon_error_str(error));
|
||||
return 2;
|
||||
}
|
||||
lua_pushnumber(L, watch_id.id);
|
||||
// dmon_error error;
|
||||
// dmon_watch_id watch_id = dmon_watch(path, dirmonitor_watch_callback, dmon_flags, NULL, &error);
|
||||
// if (watch_id.id == 0) {
|
||||
// lua_pushnil(L);
|
||||
// lua_pushstring(L, dmon_error_str(error));
|
||||
// return 2;
|
||||
// }
|
||||
// lua_pushnumber(L, watch_id.id);
|
||||
lua_pushnumber(L, 0);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int f_unwatch_dir(lua_State *L) {
|
||||
dmon_watch_id watch_id;
|
||||
watch_id.id = luaL_checkinteger(L, 1);
|
||||
dmon_unwatch(watch_id);
|
||||
// dmon_watch_id watch_id;
|
||||
// watch_id.id = luaL_checkinteger(L, 1);
|
||||
// dmon_unwatch(watch_id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -890,3 +903,4 @@ int luaopen_system(lua_State *L) {
|
|||
luaL_newlib(L, lib);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
|
|
@ -3,9 +3,11 @@
|
|||
|
||||
#include <SDL.h>
|
||||
|
||||
#ifndef __amigaos4__
|
||||
#define DMON_IMPL
|
||||
#include "dmon.h"
|
||||
#include "dmon_extra.h"
|
||||
#endif
|
||||
|
||||
#include "dirmonitor.h"
|
||||
|
||||
|
@ -32,14 +34,14 @@ static void send_sdl_event(dmon_watch_id watch_id, dmon_action action, const cha
|
|||
}
|
||||
|
||||
void dirmonitor_init() {
|
||||
dmon_init();
|
||||
// dmon_init();
|
||||
/* In theory we should register our user event but since we
|
||||
have just one type of user event this is not really needed. */
|
||||
/* sdl_dmon_event_type = SDL_RegisterEvents(1); */
|
||||
}
|
||||
|
||||
void dirmonitor_deinit() {
|
||||
dmon_deinit();
|
||||
// dmon_deinit();
|
||||
}
|
||||
|
||||
void dirmonitor_watch_callback(dmon_watch_id watch_id, dmon_action action, const char *rootdir,
|
||||
|
@ -49,11 +51,11 @@ void dirmonitor_watch_callback(dmon_watch_id watch_id, dmon_action action, const
|
|||
(void) user;
|
||||
switch (action) {
|
||||
case DMON_ACTION_MOVE:
|
||||
send_sdl_event(watch_id, DMON_ACTION_DELETE, oldfilepath);
|
||||
send_sdl_event(watch_id, DMON_ACTION_CREATE, filepath);
|
||||
// send_sdl_event(watch_id, DMON_ACTION_DELETE, oldfilepath);
|
||||
// send_sdl_event(watch_id, DMON_ACTION_CREATE, filepath);
|
||||
break;
|
||||
default:
|
||||
send_sdl_event(watch_id, action, filepath);
|
||||
// default:
|
||||
// send_sdl_event(watch_id, action, filepath);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
12
src/main.c
12
src/main.c
|
@ -12,6 +12,8 @@
|
|||
#include <signal.h>
|
||||
#elif __APPLE__
|
||||
#include <mach-o/dyld.h>
|
||||
#elif __amigaos4__
|
||||
#include "platform/amigaos4.h"
|
||||
#endif
|
||||
|
||||
#include "dirmonitor.h"
|
||||
|
@ -46,6 +48,8 @@ static void get_exe_filename(char *buf, int sz) {
|
|||
char exepath[size];
|
||||
_NSGetExecutablePath(exepath, &size);
|
||||
realpath(exepath, buf);
|
||||
#elif __amigaos4__
|
||||
strcpy(buf, _fullpath("./lite"));
|
||||
#else
|
||||
strcpy(buf, "./lite");
|
||||
#endif
|
||||
|
@ -109,11 +113,12 @@ int main(int argc, char **argv) {
|
|||
SDL_DisplayMode dm;
|
||||
SDL_GetCurrentDisplayMode(0, &dm);
|
||||
|
||||
dirmonitor_init();
|
||||
// dirmonitor_init();
|
||||
|
||||
window = SDL_CreateWindow(
|
||||
"", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, dm.w * 0.8, dm.h * 0.8,
|
||||
SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI | SDL_WINDOW_HIDDEN);
|
||||
SDL_SetWindowDisplayMode(window, &dm);
|
||||
init_window_icon();
|
||||
ren_init(window);
|
||||
|
||||
|
@ -155,6 +160,9 @@ init_lua:
|
|||
" HOME = os.getenv('" LITE_OS_HOME "')\n"
|
||||
" local exedir = EXEFILE:match('^(.*)" LITE_PATHSEP_PATTERN LITE_NONPATHSEP_PATTERN "$')\n"
|
||||
" local prefix = exedir:match('^(.*)" LITE_PATHSEP_PATTERN "bin$')\n"
|
||||
" if not HOME then\n"
|
||||
" HOME = exedir\n"
|
||||
" end\n"
|
||||
" dofile((MACOS_RESOURCES or (prefix and prefix .. '/share/lite-xl' or exedir .. '/data')) .. '/core/start.lua')\n"
|
||||
" core = require(os.getenv('LITE_XL_RUNTIME') or 'core')\n"
|
||||
" core.init()\n"
|
||||
|
@ -193,7 +201,7 @@ init_lua:
|
|||
|
||||
lua_close(L);
|
||||
ren_free_window_resources();
|
||||
dirmonitor_deinit();
|
||||
// dirmonitor_deinit();
|
||||
|
||||
return EXIT_SUCCESS;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,61 @@
|
|||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "amigaos4.h"
|
||||
|
||||
static char *getFullPath(const char *path)
|
||||
{
|
||||
char *appPath = malloc(sizeof(char) * MAX_DOS_NAME);
|
||||
BPTR pathLock = Lock(path, SHARED_LOCK);
|
||||
if (pathLock)
|
||||
{
|
||||
NameFromLock(pathLock, appPath, sizeof(char) * MAX_DOS_NAME);
|
||||
UnLock(pathLock);
|
||||
|
||||
return appPath;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char *getCurrentPath(void)
|
||||
{
|
||||
char *appPath = malloc(sizeof(char) * MAX_DOS_NAME);
|
||||
BPTR pathLock = GetCurrentDir();
|
||||
if (pathLock)
|
||||
{
|
||||
NameFromLock(pathLock, appPath, sizeof(char) * MAX_DOS_NAME);
|
||||
return appPath;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
char *_fullpath(const char *path)
|
||||
{
|
||||
static char prvPath[MAX_DOS_NAME];
|
||||
static char result[MAX_DOS_NAME];
|
||||
|
||||
if (!strcmp(path, prvPath))
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
strcpy(prvPath, path);
|
||||
|
||||
if (!strcmp(path, "./lite"))
|
||||
{
|
||||
// TODO: Add code to get the name of the executable
|
||||
strcpy(result, getFullPath("PROGDIR:lite"));
|
||||
return result;
|
||||
}
|
||||
|
||||
if (!strcmp(path, "."))
|
||||
{
|
||||
strcpy(result, getCurrentPath());
|
||||
return result;
|
||||
}
|
||||
|
||||
strcpy(result, getFullPath(path));
|
||||
return result;
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
#ifndef _AMIGAOS4_H
|
||||
#define _AMIGAOS4_H
|
||||
|
||||
#include <proto/dos.h>
|
||||
#include <proto/exec.h>
|
||||
|
||||
#define VSTRING "Lite XL OS4 2.0.5 (04.01.2022)"
|
||||
#define VERSTAG "\0$VER: " VSTRING
|
||||
|
||||
static CONST_STRPTR stack USED = "$STACK:102400";
|
||||
static CONST_STRPTR version USED = VERSTAG;
|
||||
|
||||
char *_fullpath(const char *);
|
||||
|
||||
|
||||
#endif
|
|
@ -1,5 +1,6 @@
|
|||
#include <stdio.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <assert.h>
|
||||
#include <math.h>
|
||||
#include "font_renderer.h"
|
||||
|
@ -274,16 +275,6 @@ static inline RenColor blend_pixel(RenColor dst, RenColor src) {
|
|||
return dst;
|
||||
}
|
||||
|
||||
|
||||
#define rect_draw_loop(expr) \
|
||||
for (int j = y1; j < y2; j++) { \
|
||||
for (int i = x1; i < x2; i++) { \
|
||||
*d = expr; \
|
||||
d++; \
|
||||
} \
|
||||
d += dr; \
|
||||
}
|
||||
|
||||
void ren_draw_rect(RenRect rect, RenColor color) {
|
||||
if (color.a == 0) { return; }
|
||||
|
||||
|
@ -304,15 +295,31 @@ void ren_draw_rect(RenRect rect, RenColor color) {
|
|||
y2 = y2 > clip.y + clip.height ? clip.y + clip.height : y2;
|
||||
|
||||
SDL_Surface *surface = renwin_get_surface(&window_renderer);
|
||||
RenColor *d = (RenColor*) surface->pixels;
|
||||
uint32_t *d = surface->pixels;
|
||||
|
||||
#ifdef __amigaos4__
|
||||
d += x1 + y1 * surface->pitch/sizeof(uint32_t);
|
||||
int dr = surface->pitch/sizeof(uint32_t) - (x2 - x1);
|
||||
#else
|
||||
d += x1 + y1 * surface->w;
|
||||
int dr = surface->w - (x2 - x1);
|
||||
#endif
|
||||
|
||||
if (color.a == 0xff) {
|
||||
uint32_t translated = SDL_MapRGB(surface->format, color.r, color.g, color.b);
|
||||
SDL_Rect rect = { x1, y1, x2 - x1, y2 - y1 };
|
||||
SDL_FillRect(surface, &rect, SDL_MapRGBA(surface->format, color.r, color.g, color.b, color.a));
|
||||
} else {
|
||||
rect_draw_loop(blend_pixel(*d, color));
|
||||
RenColor current_color;
|
||||
RenColor blended_color;
|
||||
for (int j = y1; j < y2; j++) {
|
||||
for (int i = x1; i < x2; i++, d++) {
|
||||
SDL_GetRGB(*d, surface->format, ¤t_color.r, ¤t_color.g, ¤t_color.b);
|
||||
blended_color = blend_pixel(current_color, color);
|
||||
*d = SDL_MapRGB(surface->format, blended_color.r, blended_color.g, blended_color.b);
|
||||
}
|
||||
d += dr;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -9,6 +9,18 @@ static int query_surface_scale(RenWindow *ren) {
|
|||
SDL_GetWindowSize(ren->window, &w_points, &h_points);
|
||||
/* We consider that the ratio pixel/point will always be an integer and
|
||||
it is the same along the x and the y axis. */
|
||||
|
||||
#ifdef __amigaos4__
|
||||
// This is a workaround when the w_pixels != w_points and h_pixels != h_points
|
||||
// because of redraw delays, especially when the "Resize with contents" is enabled
|
||||
if (w_pixels != w_points) {
|
||||
w_pixels = w_points;
|
||||
}
|
||||
if (h_pixels != h_points) {
|
||||
h_pixels = h_points;
|
||||
}
|
||||
#endif
|
||||
|
||||
assert(w_pixels % w_points == 0 && h_pixels % h_points == 0 && w_pixels / w_points == h_pixels / h_points);
|
||||
return w_pixels / w_points;
|
||||
}
|
||||
|
@ -20,7 +32,7 @@ static void setup_renderer(RenWindow *ren, int w, int h) {
|
|||
SDL_DestroyTexture(ren->texture);
|
||||
SDL_DestroyRenderer(ren->renderer);
|
||||
}
|
||||
ren->renderer = SDL_CreateRenderer(ren->window, -1, 0);
|
||||
ren->renderer = SDL_CreateRenderer(ren->window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
|
||||
ren->texture = SDL_CreateTexture(ren->renderer, SDL_PIXELFORMAT_BGRA32, SDL_TEXTUREACCESS_STREAMING, w, h);
|
||||
ren->surface_scale = query_surface_scale(ren);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue