Git Product home page Git Product logo

aegisub / aegisub Goto Github PK

View Code? Open in Web Editor NEW

This project forked from typesettingtools/aegisub

3.0K 100.0 324.0 45.27 MB

Cross-platform advanced subtitle editor

Home Page: http://devel.aegisub.org/

License: Other

Makefile 0.32% Shell 0.68% Lua 6.40% MoonScript 1.06% C++ 60.62% C# 0.27% Assembly 3.42% C 20.74% Objective-C++ 0.64% AppleScript 0.02% Inno Setup 2.14% Batchfile 0.08% M4 3.27% Objective-C 0.07% Python 0.26%

aegisub's Introduction

Aegisub

For binaries and general information see the homepage.

The bug tracker can be found at http://devel.aegisub.org.

Support is available on the forums or on IRC.

Building Aegisub

Windows

Prerequisites:

  1. Visual Studio 2015 (the free Community edition is good enough)
  2. The June 2010 DirectX SDK (the final release before DirectSound was dropped)
  3. Yasm installed to somewhere on your path.

There are a few optional dependencies:

  1. msgfmt, to build the translations
  2. WinRAR, to build the portable installer
  3. InnoSetup, to build the regular installer

All other dependencies are either stored in the repository or are included as submodules.

Building:

  1. Clone Aegisub's repository recursively to fetch it and all submodules: git clone --recursive [email protected]:Aegisub/Aegisub.git This will take quite a while and requires about 2.5 GB of disk space.
  2. Open Aegisub.sln
  3. Build the BuildTasks project.
  4. Build the entire solution.

You should now have a bin directory in your Aegisub directory which contains aegisub32d.exe, along with a pile of other files.

The Aegisub installer includes some files not built as part of Aegisub (such as Avisynth and VSFilter), so for a fully functional copy of Aegisub you now need to copy all of the files from an installed copy of Aegisub into your bin directory (and don't overwrite any of the files already there). You'll also either need to copy the automation directory into the bin directory, or edit your automation search paths to include the automation directory in the source tree.

After building the solution once, you'll want to switch to the Debug-MinDep configuration, which skips checking if the dependencies are out of date, as that takes a while.

OS X

A vaguely recent version of Xcode and the corresponding command-line tools are required. Nothing older than Xcode 5 has been tested recently, but it is likely that some later versions of Xcode 4 are good enough.

For personal usage, you can use homebrew to install almost all of Aegisub's dependencies:

brew install autoconf ffmpeg freetype gettext ffms2 fftw fribidi libass m4
brew install --devel --with-gc64 luajit
brew install --HEAD icu4c
brew link --force icu4c
brew link --force gettext
brew install --HEAD --c++11 --with-icu4c boost

wxWidgets is located in vendor/wxWidgets, and can be built like so:

CPPFLAGS="$CPPFLAGS -D__ASSERT_MACROS_DEFINE_VERSIONS_WITHOUT_UNDERSCORES=1" \
./configure --disable-aboutdlg --disable-animatectrl --disable-aui --disable-any \
--disable-bannerwindow --disable-base64 --disable-calendar --disable-caret \
--disable-cmdline --disable-colourpicker --disable-compat28 --disable-config \
--disable-constraints --disable-datepick --disable-dctransform --disable-debugreport \
--disable-dialupman --disable-docview --disable-filehistory --disable-finddlg \
--disable-fs_archive --disable-fs_inet --disable-fs_zip --disable-fsvolume \
--disable-fswatcher --disable-gif --disable-help --disable-html --disable-ipc \
--disable-joystick --disable-jpeg --disable-largefile --disable-markup --disable-mdi \
--disable-mediactrl --disable-metafiles --disable-miniframe --disable-notifmsg \
--disable-numberdlg --disable-pcx --disable-pnm --disable-postscript \
--disable-prefseditor --disable-printarch --disable-progressdlg --disable-propgrid \
--disable-protocol --disable-protocols --disable-rearrangectrl --disable-ribbon \
--disable-richtext --disable-richtooltip --disable-snglinst --disable-sockets \
--disable-sockets --disable-sound --disable-splash --disable-splines \
--disable-std_iostreams --disable-svg --disable-tarstream --disable-tiff \
--disable-tipdlg --disable-tipwindow --disable-url --disable-webkit --disable-webview \
--disable-wizarddlg --disable-xrc \
--enable-geometry --enable-imaglist --enable-listctrl --enable-stc --with-cocoa \
--with-libpng=yes --with-macosx-version-min=10.9 \
--with-opengl \
--without-libjpeg --without-libtiff --without-regex \
&& make

Once the dependencies are installed, build Aegisub with autoreconf && ./configure --with-wxdir=/path/to/Aegisub/vendor/wxWidgets && make && make osx-bundle. autoreconf should be skipped if you are building from a source tarball rather than git.

Updating Moonscript

From within the Moonscript repository, run bin/moon bin/splat.moon -l moonscript moonscript/ > bin/moonscript.lua. Open the newly created bin/moonscript.lua, and within it make the following changes:

  1. Prepend the final line of the file, package.preload["moonscript"](), with a return, producing return package.preload["moonscript"]().
  2. Within the function at package.preload['moonscript.base'], remove references to moon_loader, insert_loader, and remove_loader. This means removing their declarations, definitions, and entries in the returned table.
  3. Within the function at package.preload['moonscript'], remove the line _with_0.insert_loader().

The file is now ready for use, to be placed in automation/include within the Aegisub repo.

License

All files in this repository are licensed under various GPL-compatible BSD-style licenses; see LICENCE and the individual source files for more information. The official Windows and OS X builds are GPLv2 due to including fftw3.

aegisub's People

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aegisub's Issues

automation unit test fail in aegisub.re module

./aegisub-lua tests/busted.lua -p 'moon' tests/modules will randomly fail. Sometimes it get

●●●●●●●●●●●●●●●●●●●●●●terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<std::out_of_range> >'
  what():  Invalid UTF-8 sequence encountered while trying to encode UTF-32 character
Aborted (core dumped)
Back trace:
#0  0x00007ffff5e68c37 in __GI_raise (sig=sig@entry=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56
#1  0x00007ffff5e6c028 in __GI_abort () at abort.c:89
#2  0x00007ffff677fe63 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#3  0x00007ffff6784fa6 in ?? () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#4  0x00007ffff6784fe1 in std::terminate() () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#5  0x00007ffff6785213 in __cxa_throw () from /usr/lib/x86_64-linux-gnu/libstdc++.so.6
#6  0x000000000048c498 in boost::throw_exception<std::out_of_range> (e=...) at /home/travis/builds/Aegisub/Aegisub/vendor/boost/boost/throw_exception.hpp:70
#7  0x000000000049064a in boost::u8_to_u32_iterator<char const*, int>::invalid_sequence ()
    at /home/travis/builds/Aegisub/Aegisub/vendor/boost/boost/regex/pending/unicode_iterator.hpp:601
#8  0x000000000048e03d in boost::u8_to_u32_iterator<char const*, int>::u8_to_u32_iterator (this=0x7fffffffd870, b=0x400906de "", start=0x400906d9 "\230\203☃",
    end=0x400906de "") at /home/travis/builds/Aegisub/Aegisub/vendor/boost/boost/regex/pending/unicode_iterator.hpp:583
#9  0x000000000048caa5 in boost::re_detail::do_regex_search<char const*, std::allocator<boost::sub_match<char const*> > > (first=0x400906d9 "\230\203☃",
    last=0x400906de "", m=..., e=..., flags=260, base=0x400906d9 "\230\203☃") at /home/travis/builds/Aegisub/Aegisub/vendor/boost/boost/regex/icu.hpp:620
#10 0x000000000048cebf in boost::u32regex_search<char const*, std::allocator<boost::sub_match<char const*> > > (first=0x400906d9 "\230\203☃", last=0x400906de "",
    m=..., e=..., flags=260) at /home/travis/builds/Aegisub/Aegisub/vendor/boost/boost/regex/icu.hpp:633
#11 0x00000000004883b5 in (anonymous namespace)::search (re=..., str=0x400906d8 "☃☃", len=6, start=1, result=...)
    at /home/travis/builds/Aegisub/Aegisub/libaegisub/lua/modules/re.cpp:48
#12 0x0000000000488798 in (anonymous namespace)::regex_search (re=..., str=0x400906d8 "☃☃", len=6, start=1)
    at /home/travis/builds/Aegisub/Aegisub/libaegisub/lua/modules/re.cpp:68
#13 0x000000000fb6b4fd in ?? ()
#14 0x000000004023e9b8 in ?? ()
#15 0x00000000005239f4 in lj_vmeta_tsetv ()
#16 0x0000000000517b80 in lua_pcall (L=<optimized out>, nargs=<optimized out>, nresults=<optimized out>, errfunc=<optimized out>) at lj_api.c:1052
#17 0x0000000000415636 in main (argc=5, argv=0x7fffffffdc88) at /home/travis/builds/Aegisub/Aegisub/automation/tests/aegisub.cpp:93

And sometimes:

●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●◼◼◼◼◼◼●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●●
82 successes / 6 failures / 0 errors / 0 pending : 0.359991 seconds

Failure → tests/modules/re.moon @ 134
split should not count skipped segments in the maximum when skipping empty
tests/modules/re.moon:138: Expected objects to be equal.
Passed in:
(string) 'a,,b,c'
Expected:
(string) 'a'

Failure → tests/modules/re.moon @ 148
split should support multi-character delimiters
tests/modules/re.moon:151: Expected objects to be equal.
Passed in:
(number) 6
Expected:
(number) 3

Failure → tests/modules/re.moon @ 156
split should not fail on basic splits
tests/modules/re.moon:159: Expected objects to be equal.
Passed in:
(number) 6
Expected:
(number) 4

Failure → tests/modules/re.moon @ 165
split should be able to skip empty segments
tests/modules/re.moon:168: Expected objects to be equal.
Passed in:
(number) 6
Expected:
(number) 3

Failure → tests/modules/re.moon @ 173
split should return an empty table when given only empty segments
/usr/local/share/lua/5.1/busted/core.lua:156: Expected objects to be equal.
Passed in:
(number) 4
Expected:
(number) 0

Failure → tests/modules/re.moon @ 178
split should be able to split on word boundaries
tests/modules/re.moon:181: Expected objects to be equal.
Passed in:
(number) 7
Expected:
(number) 5

This looks like something related to thread-safety to me. But I am not familiar with lua and unable to fix this issue.

Audio shifted by 0.1s

After loading some videos into Aegisub, the audio is shifted by ~0.1s. I've tested with the "Windows 32 bit portable" versions from http://plorkyeran.com/aegisub/, and it seems it started happening after r8725. Below are screenshots after loading the same video into r8700 and r8725. Only the audio is shifted, and the video stays the same.

r8700:
image

r8725:
image

Not all videos have this issue. The video I used in the screenshots can be downloaded from this torrent (it's episode 12 of Steins;Gate 0, downloaded from ohys-raws).

I'm wondering if any of the library updates between r8700 and r8725 might have introduced this. Not sure how the revision numbers are generated, but from the changelog it seems to be between 79fb5cb and 5afc543? Quick link: https://github.com/Aegisub/Aegisub/commits/master?before=524c6114a82157b143567240884de3a6d030b091+210

Does this ring a bell with anyone? If not, I can try digging a bit more after I find time to set up the build.

Tapping to time karaoke

Sorry for the TL;DR. This is kind of a question and kind of a solicitation for ideas for an implementation if it becomes clear there is no good way to do this given the current capabilities of Aegisub.

I am interested in timing songs down to the syllable level, but the method as described in the karaoke timing tutorial, i.e. shifting markers and replaying them repeatedly, feels very unintuitive as a primary way of timing. It's a nice interface for making small fixes where needed, but time consuming if it needs to be done for every syllable.

I'm looking for a way to time syllables by simply tapping to it, almost like a rhythm game. It's intuitive, and theoretically a person familiar with the song and have good accuracy can time it in one go. Is there a way to do that in Aegisub?

If not, I am willing to work on a prototype implementation of such a feature. Given the existing codebase, what I see as the easiest path there is:

  1. add two hotkeyable COMMAND_NORMAL buttons in Karaoke mode that are enabled when the audio is playing
    1. "mark syllable start" will:
      1. set the start time of the currently selected syllable to the current timestamp of the audio
      2. select the next syllable in the line, if it is not the last syllable
    2. "mark line end" will:
      1. set the end time of the line and last syllable to the current timestamp of the audio
      2. select the next ASS line and its first syllable, and invoke "mark syllable start"
  2. add two COMMAND_TOGGLE buttons in Karaoke mode
    1. "select next syllable after mark syllable start": if enabled, allows 1.i.b above
    2. "continue to next line after mark line end": if enabled, allows 1.ii.b above

The workflow this allows:

  1. add all of the untimed lyrics of the song
  2. using Karaoke mode, do one pass through the song to commit all the syllable splits, still without timing anything
  3. play song from the beginning, tapping "mark syllable start" to each syllable, making sure to tap "mark line end" to continue on to the next ASS line

I believe the advantage of this implementation of is that it requires no additional state in the Timing Controller. The only state it uses is cur_syl, and the only input it requires from the Audio Controller is the current timestamp.

The only unintuitive part of this UI is the additional "mark line end" button. Ideally I'd just like one button that does "mark syllable start" and continues seamlessly into the next line. The lack of a "no-syllable-selected" state in the current Karaoke Timing Controller thwarts this. If there is a "no-syllable-selected" state, we can instead have a "mark syllable" button that 1) if no syllables are selected, marks the start of the first syllable and select it, 2) if a non-end syllable is selected, mark its end time, 3) if the end syllable is selected, mark its end time, move to the next ASS line, and invoke (1).

As an example, here's a karaoke timer webapp that does what I described. Its disadvantage is that it depends solely on the tapping accuracy of the timer with no UI to fix / fine tune each syllable's timing. I want to marry the advantages of this with the existing Aegisub interface to have the best of both worlds. ;)

Crash when changing font

I'm using Aegisub 83736b4 on windows 10.0.17763.55, compiled with VS Community 2017 (x64 Release).

The compile runs fine and I get aegisub64.exe. But there is some problem with fonts. With the default Arial font, 月语 in the test string shows as tofu (blocks). I tried to change the font to some Chinese fonts but then no character (including letters and numbers) is shown.

Further more, it crashes when I select 微软雅黑 Light (msyh.ttc: Light). Backtrace attached below.

There is no issue displaying Chinese characters in the 3.2.2 binary release, even when font selected to Arial.

aegisub64.exe!memcpy_repmovs() Line 115
	At f:\dd\vctools\crt\vcruntime\src\string\amd64\memcpy.asm(115)
aegisub64.exe!`anonymous namespace'::GdiFont::GetData(unsigned char * data=0x0000028e1d660080, unsigned __int64 offset=12065452, unsigned __int64 len=116440) Line 60
	At aegisub\src\libass_gdi_fontselect.cpp(60)
aegisub64.exe!read_stream_font(FT_StreamRec_ * stream, unsigned long offset, unsigned char * buffer, unsigned long count=116440) Line 121
	At aegisub\vendor\libass\libass\ass_font.c(121)
aegisub64.exe!FT_Stream_EnterFrame(FT_StreamRec_ * stream=0x0000028ea3f81810, unsigned long count=116440) Line 271
	At aegisub\vendor\freetype2\src\base\ftstream.c(271)
aegisub64.exe!tt_face_load_gasp(TT_FaceRec_ * face=0x0000028e1cddb700, FT_StreamRec_ * stream=0x0000028ea3f81810) Line 1269
	At aegisub\vendor\freetype2\src\sfnt\ttload.c(1269)
aegisub64.exe!sfnt_load_face(FT_StreamRec_ * stream=0x0000028ea3f81810, TT_FaceRec_ * face=0x0000028e1cddb700, int face_index=0, int num_params, FT_Parameter_ * params=0x0000000000000000) Line 1166
	At aegisub\vendor\freetype2\src\sfnt\sfobjs.c(1166)
aegisub64.exe!tt_face_init(FT_StreamRec_ * stream=0x0000028ea3f81810, FT_FaceRec_ * ttface=0x0000028e1cddb700, int face_index=0, int num_params=0, FT_Parameter_ * params=0x0000000000000000) Line 563
	At aegisub\vendor\freetype2\src\truetype\ttobjs.c(563)
aegisub64.exe!open_face(FT_DriverRec_ * driver=0x0000028e1cdd3fb0, FT_StreamRec_ * * astream=0x000000ac3dafb510, unsigned char external_stream, long face_index=0, int num_params=0, FT_Parameter_ * params=0x0000000000000000, FT_FaceRec_ * * aface=0x000000ac3dafb520) Line 1170
	At aegisub\vendor\freetype2\src\base\ftobjs.c(1170)
aegisub64.exe!FT_Open_Face(FT_LibraryRec_ * library=0x0000028e1ce4f2c0, const FT_Open_Args_ * args=0x000000ac3dafb5d0, long face_index=0, FT_FaceRec_ * * aface=0x000000ac3dafb5b0) Line 2151
	At aegisub\vendor\freetype2\src\base\ftobjs.c(2151)
aegisub64.exe!add_face(font_selector * fontsel, ass_font * font=0x000000ac3dafb680, unsigned int ch) Line 177
	At aegisub\vendor\libass\libass\ass_font.c(177)
[Inline Framework] aegisub64.exe!ass_font_new(cache * font_cache=0x0000028e1cde7800, ass_library * library=0x0000028e1aa31d10, FT_LibraryRec_ * ftlibrary=0x0000028e1ce4f2c0, font_selector * fontsel=0x0000028ea3f820d0, ass_font_desc *) Line 249
	At aegisub\vendor\libass\libass\ass_font.c(249)
aegisub64.exe!update_font(ass_renderer * render_priv=0x0000028e1cddb290) Line 130
	At aegisub\vendor\libass\libass\ass_parse.c(130)
aegisub64.exe!reset_render_context(ass_renderer * render_priv=0x0000028e1cddb290, ass_style * style=0x0000028e1cddb4f8) Line 869
	At aegisub\vendor\libass\libass\ass_render.c(869)
[Inline Framework] aegisub64.exe!init_render_context(ass_renderer *) Line 897
	At aegisub\vendor\libass\libass\ass_render.c(897)
aegisub64.exe!ass_render_event(ass_renderer * render_priv=0x0000028e1cddb290, ass_event * event=0x0000028e1a9c8620, EventImages * event_images=0x0000028e1b0f5350) Line 2412
	At aegisub\vendor\libass\libass\ass_render.c(2412)
aegisub64.exe!ass_render_frame(ass_renderer * priv=0x0000028e1cddb290, ass_track * track=0x0000028e1cdd41f0, __int64 now=100, int *) Line 2999
	At aegisub\vendor\libass\libass\ass_render.c(2999)
aegisub64.exe!`anonymous namespace'::LibassSubtitlesProvider::DrawSubtitles(VideoFrame & frame={...}, double time) Line 177
	At aegisub\src\subtitles_provider_libass.cpp(177)
aegisub64.exe!SubtitlesPreview::UpdateBitmap() Line 113
	At aegisub\src\subs_preview.cpp(113)
aegisub64.exe!DialogStyleEditor::OnCommandPreviewUpdate(wxCommandEvent & event={...}) Line 500
	At aegisub\src\dialog_style_editor.cpp(500)
aegisub64.exe!wxEvtHandler::ProcessEventIfMatchesId(const wxEventTableEntryBase & entry, wxEvtHandler * handler, wxEvent & event={...}) Line 1412
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1412)
aegisub64.exe!wxEvtHandler::SearchDynamicEventTable(wxEvent & event={...}) Line 1860
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1860)
[Inline Framework] aegisub64.exe!wxEvtHandler::TryHereOnly(wxEvent &) Line 1603
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1603)
aegisub64.exe!wxEvtHandler::TryBeforeAndHere(wxEvent & event={...}) Line 3635
	At aegisub\vendor\wxwidgets\include\wx\event.h(3635)
aegisub64.exe!wxEvtHandler::ProcessEventLocally(wxEvent & event={...}) Line 1540
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1540)
aegisub64.exe!wxEvtHandler::ProcessEvent(wxEvent & event={...}) Line 1513
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1513)
aegisub64.exe!wxWindowBase::TryAfter(wxEvent & event={...}) Line 3457
	At aegisub\vendor\wxwidgets\src\common\wincmn.cpp(3457)
aegisub64.exe!wxEvtHandler::ProcessEvent(wxEvent & event={...}) Line 1526
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1526)
aegisub64.exe!wxEvtHandler::SafelyProcessEvent(wxEvent & event) Line 1631
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1631)
[Inline Framework] aegisub64.exe!wxWindowBase::HandleWindowEvent(wxEvent &) Line 1534
	At aegisub\vendor\wxwidgets\src\common\wincmn.cpp(1534)
aegisub64.exe!wxControlWithItemsBase::SendSelectionChangedEvent(int eventType=10027) Line 306
	At aegisub\vendor\wxwidgets\src\common\ctrlsub.cpp(306)
aegisub64.exe!wxComboBox::MSWCommand(unsigned int param, unsigned short id) Line 334
	At aegisub\vendor\wxwidgets\src\msw\combobox.cpp(334)
aegisub64.exe!wxWindow::HandleCommand(unsigned short id_, unsigned short cmd, HWND__ * control=0x00000000003409b8) Line 5222
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(5222)
aegisub64.exe!wxWindow::MSWHandleMessage(__int64 * result=0x000000ac3dafc5e0, unsigned int message=273, unsigned __int64 wParam=623440, __int64 lParam=3410360) Line 2925
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(2925)
aegisub64.exe!wxWindow::MSWWindowProc(unsigned int message=273, unsigned __int64 wParam=623440, __int64 lParam=3410360) Line 3524
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(3524)
aegisub64.exe!wxTopLevelWindowMSW::MSWWindowProc(unsigned int message=273, unsigned __int64 wParam=623440, __int64 lParam=3410360) Line 324
	At aegisub\vendor\wxwidgets\src\msw\toplevel.cpp(324)
aegisub64.exe!wxDialog::MSWWindowProc(unsigned int message=273, unsigned __int64 wParam=623440, __int64 lParam=3410360) Line 351
	At aegisub\vendor\wxwidgets\src\msw\dialog.cpp(351)
aegisub64.exe!wxWndProc(HWND__ * hWnd=0x00000000001409a6, unsigned int message=273, unsigned __int64 wParam=623440, __int64 lParam=3410360) Line 2668
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(2668)
[External Code]
aegisub64.exe!wxWindow::MSWDefWindowProc(unsigned int nMsg=273, unsigned __int64 wParam=66536, __int64 lParam=789122) Line 2210
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(2210)
aegisub64.exe!wxWindow::MSWWindowProc(unsigned int message=273, unsigned __int64 wParam=66536, __int64 lParam=789122) Line 3530
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(3530)
aegisub64.exe!wxChoice::MSWWindowProc(unsigned int nMsg=273, unsigned __int64 wParam=66536, __int64 lParam=789122) Line 705
	At aegisub\vendor\wxwidgets\src\msw\choice.cpp(705)
aegisub64.exe!wxComboBox::MSWWindowProc(unsigned int nMsg=273, unsigned __int64 wParam=66536, __int64 lParam=789122) Line 217
	At aegisub\vendor\wxwidgets\src\msw\combobox.cpp(217)
aegisub64.exe!wxWndProc(HWND__ * hWnd=0x00000000003409b8, unsigned int message=273, unsigned __int64 wParam=66536, __int64 lParam=789122) Line 2668
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(2668)
[External Code]
aegisub64.exe!wxGUIEventLoop::PreProcessMessage(tagMSG * msg=0x000000ac3dafd948) Line 96
	At aegisub\vendor\wxwidgets\src\msw\evtloop.cpp(96)
aegisub64.exe!wxGUIEventLoop::ProcessMessage(tagMSG * msg=0x000000ac3dafd948) Line 163
	At aegisub\vendor\wxwidgets\src\msw\evtloop.cpp(163)
aegisub64.exe!wxGUIEventLoop::Dispatch() Line 230
	At aegisub\vendor\wxwidgets\src\msw\evtloop.cpp(230)
[Inline Framework] aegisub64.exe!wxEventLoopManual::ProcessEvents() Line 228
	At aegisub\vendor\wxwidgets\src\common\evtloopcmn.cpp(228)
aegisub64.exe!wxEventLoopManual::DoRun() Line 273
	At aegisub\vendor\wxwidgets\src\common\evtloopcmn.cpp(273)
aegisub64.exe!wxEventLoopBase::Run() Line 76
	At aegisub\vendor\wxwidgets\src\common\evtloopcmn.cpp(76)
[Inline Framework] aegisub64.exe!wxDialogModalData::RunLoop() Line 62
	At aegisub\vendor\wxwidgets\src\msw\dialog.cpp(62)
aegisub64.exe!wxDialog::ShowModal() Line 193
	At aegisub\vendor\wxwidgets\src\msw\dialog.cpp(193)
[Inline Framework] aegisub64.exe!SubsEditBox::{ctor}::__l2::<lambda_10d2199829f6605e4163059fa3775cd9>::operator()(wxCommandEvent &) Line 131
	At aegisub\src\subs_edit_box.cpp(131)
aegisub64.exe!wxEventFunctorFunctor<wxEventTypeTag<wxCommandEvent>,<lambda_10d2199829f6605e4163059fa3775cd9> >::operator()(wxEvtHandler * __formal=0x0000000000000000, wxEvent & event) Line 470
	At aegisub\include\wx\event.h(470)
aegisub64.exe!wxEvtHandler::ProcessEventIfMatchesId(const wxEventTableEntryBase & entry, wxEvtHandler * handler, wxEvent & event={...}) Line 1412
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1412)
aegisub64.exe!wxEvtHandler::SearchDynamicEventTable(wxEvent & event={...}) Line 1860
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1860)
[Inline Framework] aegisub64.exe!wxEvtHandler::TryHereOnly(wxEvent &) Line 1603
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1603)
aegisub64.exe!wxEvtHandler::TryBeforeAndHere(wxEvent & event={...}) Line 3635
	At aegisub\vendor\wxwidgets\include\wx\event.h(3635)
aegisub64.exe!wxEvtHandler::ProcessEventLocally(wxEvent & event={...}) Line 1540
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1540)
aegisub64.exe!wxEvtHandler::ProcessEvent(wxEvent & event={...}) Line 1513
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1513)
aegisub64.exe!wxEvtHandler::SafelyProcessEvent(wxEvent & event={...}) Line 1631
	At aegisub\vendor\wxwidgets\src\common\event.cpp(1631)
[Inline Framework] aegisub64.exe!wxWindowBase::HandleWindowEvent(wxEvent &) Line 1534
	At aegisub\vendor\wxwidgets\src\common\wincmn.cpp(1534)
[Inline Framework] aegisub64.exe!wxControl::ProcessCommand(wxCommandEvent &) Line 288
	At aegisub\vendor\wxwidgets\src\msw\control.cpp(288)
[Inline Framework] aegisub64.exe!wxButton::SendClickEvent() Line 371
	At aegisub\vendor\wxwidgets\src\msw\button.cpp(371)
aegisub64.exe!wxButton::MSWCommand(unsigned int param, unsigned short __formal=59129) Line 419
	At aegisub\vendor\wxwidgets\src\msw\button.cpp(419)
aegisub64.exe!wxWindow::HandleCommand(unsigned short id_, unsigned short cmd, HWND__ * control=0x00000000000a0a88) Line 5222
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(5222)
aegisub64.exe!wxWindow::MSWHandleMessage(__int64 * result=0x000000ac3dafe990, unsigned int message=273, unsigned __int64 wParam=33576, __int64 lParam=658056) Line 2925
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(2925)
aegisub64.exe!wxWindow::MSWWindowProc(unsigned int message=273, unsigned __int64 wParam=33576, __int64 lParam=658056) Line 3524
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(3524)
aegisub64.exe!wxWndProc(HWND__ * hWnd=0x0000000000230a28, unsigned int message=273, unsigned __int64 wParam=33576, __int64 lParam=658056) Line 2668
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(2668)
[External Code]
aegisub64.exe!wxWindow::MSWDefWindowProc(unsigned int nMsg=514, unsigned __int64 wParam=0, __int64 lParam=2359324) Line 2210
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(2210)
aegisub64.exe!wxWindow::MSWWindowProc(unsigned int message=514, unsigned __int64 wParam=0, __int64 lParam=2359324) Line 3530
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(3530)
[Inline Framework] aegisub64.exe!wxAnyButton::MSWWindowProc(unsigned int) Line 658
	At aegisub\vendor\wxwidgets\src\msw\anybutton.cpp(658)
aegisub64.exe!wxButton::MSWWindowProc(unsigned int nMsg=514, unsigned __int64 wParam=0, __int64 lParam=2359324) Line 444
	At aegisub\vendor\wxwidgets\src\msw\button.cpp(444)
aegisub64.exe!wxWndProc(HWND__ * hWnd=0x00000000000a0a88, unsigned int message=514, unsigned __int64 wParam=0, __int64 lParam=2359324) Line 2668
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(2668)
[External Code]
[Inline Framework] aegisub64.exe!wxWindow::MSWSafeIsDialogMessage(tagMSG *) Line 2532
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(2532)
aegisub64.exe!wxWindow::MSWProcessMessage(tagMSG * pMsg=0x000000ac3daff608) Line 2416
	At aegisub\vendor\wxwidgets\src\msw\window.cpp(2416)
aegisub64.exe!wxGUIEventLoop::PreProcessMessage(tagMSG * msg=0x000000ac3daff608) Line 145
	At aegisub\vendor\wxwidgets\src\msw\evtloop.cpp(145)
aegisub64.exe!wxGUIEventLoop::ProcessMessage(tagMSG * msg=0x000000ac3daff608) Line 163
	At aegisub\vendor\wxwidgets\src\msw\evtloop.cpp(163)
aegisub64.exe!wxGUIEventLoop::Dispatch() Line 230
	At aegisub\vendor\wxwidgets\src\msw\evtloop.cpp(230)
[Inline Framework] aegisub64.exe!wxEventLoopManual::ProcessEvents() Line 228
	At aegisub\vendor\wxwidgets\src\common\evtloopcmn.cpp(228)
aegisub64.exe!wxEventLoopManual::DoRun() Line 273
	At aegisub\vendor\wxwidgets\src\common\evtloopcmn.cpp(273)
aegisub64.exe!wxEventLoopBase::Run() Line 76
	At aegisub\vendor\wxwidgets\src\common\evtloopcmn.cpp(76)
aegisub64.exe!wxAppConsoleBase::MainLoop() Line 380
	At aegisub\vendor\wxwidgets\src\common\appbase.cpp(380)
aegisub64.exe!AegisubApp::OnRun() Line 461
	At aegisub\src\main.cpp(461)
aegisub64.exe!wxEntryReal(int & argc=446334688, wchar_t * * argv=0x0000000000000000) Line 503
	At aegisub\vendor\wxwidgets\src\common\init.cpp(503)
aegisub64.exe!wxEntry(int & argc=1, wchar_t * * argv=0x0000028e1a9cc200) Line 181
	At aegisub\vendor\wxwidgets\src\msw\main.cpp(181)
[External Code]

Some key functions need corresponding hotkeys

I think some of the key functions really need corresponding hotkeys. For instance, timing/make time continuous change start or change end, subtitle/duplicate lines, subtitle/join lines.

Support BorderStyle=4

In versions 0.13.7 and higher of libass, it is possible to add a semitransparent rectangular box around subtitles (previously, it would display a horizontal artifact when using the normal box, plus it is a different shape, previously it reflexted the length of the lines, now it is rectangular).

Aegisub no longer crashes when opening such file, but it would be nice if it were able to read, set and display this value (both in style manager and in display preview).

More details here: libass/libass#268

Change focus via keyboard

In the manual, it says that Aegisub relies heavily on the concept of focus. Remarkably, I seem to be unable to find away to change focus via keyboard.

Like, how would I go from video focus to edit the line that is selected in the subtitle grid and then go back?

Linux: use relocatable paths

Can you let Aegisub search for translations and other files located relatively to the binary instead of using absolute paths? On Linux you can use realpath("/proc/self/exe", NULL) to find out the executable's path, but I assume there's a boost function that does the same. The files that need an edit would be libaegisub/unix/path.cpp and src/aegisublocale.cpp.

Check wayback machine for unresolved issues/feature requests of the old tracker

I tried checking whether the old trac has been archived and apparently it has, although some pages are a bit older than preferrable. The last snapshot of the main site appears to have been made in 2016-11, so we can probably assume that to be the most recent state for a capture. I could crawl my IRC logs for a more precise date of when the site went down, but I don't see a need for this currently.

Below are a few sites with bug listings that could be checked – or "manually imported", rather, sorted by relevance.

2016-10 Bugs associated with most recent version (3.2.2)
2015-04 Tickets for milestone 4.0.0
2013-11 Active Tickets by Milestone (latest version appears to be 3.0.4)

Barely relevant:

2015-25 Tickets for milestone 3.3.0
2013-06 Active Tickets (latest version appears to be 3.0.2)

Lift huge file limit or add specific error message

When attempting to open ASS subtitles above a certain size (100MB?), Aegisub will fail with a useless error message (“Cannot convert from utf-8 to binary”). It has no problem saving such files however.

Whether or not such files are sane, Aegisub should handle this case a little better and at least give meaningful errors/warnings (also when saving such files). I’m in favor of just removing the limit altogether.

Add a hotkeyable command to toggle comment

Currently, you can use the Alt+c accelerator to toggle a comment line, but that has the downside of changing focus to the checkbox and cannot be bound to a different key.

Update TTML export to conform to a more commonly accepted standard

The most universally accepted TTML standard is the one set by Netflix. An example can be found here:
https://partnerhelp.netflixstudios.com/hc/en-us/articles/360000456768

Additionally, the much more comprehensive W3C TTML spec can be found here:
https://www.w3.org/TR/2018/CR-ttml1-20180424/

Updating the TTML export function to at least comply with the Netflix version of the TTML spec would also make Aegisub a viable platform for creation of subtitle materials for Hulu, Amazon, go90, and Crackle.

Also, the "libgosubs" and gass2ttml" repositories from https://github.com/wargarblgarbl may be of some use toward this goal.

Some hot keys don't work on Win7 or Win10 1803

For example, when I press the Enter key, the software should has accepted the changes and moved to the next line.But actually it doesn't work. And many hot keys don't work just like the Enter key. I have tried to find an effective solution to this problem on the Internet but I failed.
This problem has made me disappointed for a long time. Sincerely hope someone can help me ~! : )

Crash when we setup a big blur value.

When we setup a bit blur value we can got a crash (in case with {\blur100000000}) or freeze on video (in case with {\be100000000000} tag)
I suggest make a handler on value more than 5k.

screen with blur tag:
default

Video view panning

When the video display size is larger than the window, it is currently not possible to pan the video view. This makes it rather cumbersome to edit signs on high-resolution video or at high zoom levels.

Auto-snapping times to frames

If times are not aligned properly, it can cause micro gaps/collisions in the subtitle renderer. I usually work around this issue by shifting everything by 0 frames, but it would be nice if the timing post processor and audio view had an option to do this automatically.

Feature Request: Have CTRL-Down/Up seek video to selection when "Seek Video to line start on selection change" is disabled

In Aegisub, my workflow involves having "Seek Video to line start on selection change" is disabled.

However, there are times when I need to quickly scroll through and inspect each subtitle visually. For my workflow, I can do this in one of two ways: I can either temporarily re-enable "Seek Video" and then just scroll down, or I can leave it disabled and hit CTRL-1 on each subtitle as I scroll down, which is a finger workout.

It'd be great if CTRL-Up/Down did this on its own. It also doesn't appear to be allocated to any hotkey function currently.

Changing subtitle renderers rescales the window

Sometimes I switch subtitle renderers because I want to compare how subtitles display from one to the other. When I do this, the video display usually rescales (e.g. from 100% zoom to 50%). If the video display is small enough compared to the aegisub window, the display does not rescale.

No rescaling would allow for easier comparisons between subtitle renderers at full res / 100% zoom (I can take screenshots of the different renderings and compare those, but that's not an intuitive solution for everyone).

Sometimes the rescale sets the zoom to a weird resolution, like 31.25%, so you can't even use the scrollwheel to get back to full res. You can use the zoom % box to type in 100%--but again, maybe this is not an intuitive solution for everyone.

Certain unicode emoticons/pictograms result in error

  • After
    • opening a .ass subtitle
    • copy-pasting text into the editor
      containing certain unicode pictograms such as:
      🌀🌤🌂🎜👤👥👀😕
      \u1F300 \u1F324 \u1F302 \u1F39C \u1F464 \u1F465 \u1F440 \u1F615

i get a blank dialog, on closing it, the program is closed as well
linux-LTS Aegisub 6962-master-2cb92a5 ubuntu ppa (alternatives? arch seems newer)

edit menu❭ help❭ about seems to provide wrong version info
menu❭ help❭ logWindw → 3.2.3~git7834-2cb92a5f7

Screenshot from 2019-04-26 18-00-53

Screenshot from 2019-04-26 18-00-45

but simpler unicode ☹☺ does not have that problem

r8942 space between subtitles

Hi, Thanks for the latest update.
I use aegisub for mac and love to see those volume/zoom sliders working now.
My question would be if anybody could change the behavior of the new line
witch is sticking to the previous?
I mean to have an option of putting an interval in milliseconds
between a subtitle line and the following line, interval that will automatically appear
after confirming with the Enter or G key.
Now I have to modify each line and it's really Neanderthal. :D

Thanks in advance!

What is the translation workflow? Does't it support multiple versions?

I found translation assistant and tried to use it. It showed me a dialog with original text and translation box. I typed my translation in the latter field and pressed Enter. After that my text had replaced the original text and to seemed disappear forever. I mean I cannot find it anywhere anymore, so I cannot compare or revise anything.

So does it support multiple languages or not? Can this Sophisicated Software do this thing: help in plain translations?

New release

Version 3.2.2 was released 4 years ago and quite some changes have been made since then. A new release may be good I think, especially since most Linux distros will only add official releases to their packaging systems and Windows and Mac users don't have to search for prebuilt snapshots from the git master branch.

Frame timestamps are computed differently from subtitle renderers

Minimal testcase: load a dummy video with frame rate 100 fps, seek to frame 1, hit ctrl-3 and ctrl-4. The line ends up being timed to 0:00.00 - 0:00.01, which displays only on frame 0 rather than on frame 1.

On a 100 fps source, this affects every frame, but it also happens at lower frame rates; roughly 13% of the frames are affected on a 60/1.001 fps source.

I'm guessing this can be replaced by just:

	if (type == START) {
		return TimeAtFrame(frame);
	}

	if (type == END) {
		return TimeAtFrame(frame + 1);
	}

MacOS: Crashing randomly when working with a video

Aegisub r8898 on MacOS X 10.13.4 crashes randomly when translating with a video, after moving from one line to the other or moving the slider along the spectrum display. With larger video files it's happening more often than with the smaller ones.

Linux Apply Karaoke Broken

Hi. I use Aegisub 3.2.2 in Ubuntu.
After Applying Karaoke Template, distance between words is too large. It seems that the parameters that aegisub passes to the automation are broken and their values are not correct.


Edit:
So sorry for incomplete description.
This problem only arise for Persian fonts.
we use Arabic Karaoke v2 By Anas (kara-templater-rtl). this automation just applies karaoke from right to left. and when I was seeing its difference with the default's Apply Karaoke Template, their difference was really Insignificant and I don't think the problem arise from that. I think the problem is with aegisub itself in linux platform because in windows it's ok and I created multiple rtl language karaokes with same fonts in windows.

Fails to build with Boost 1.69 (develop snapshot)

After boostorg/gil@32fec9f05ba8 build fails. See error log.

src/subtitles_provider_libass.cpp:49:10: fatal error: 'boost/gil/gil_all.hpp' file not found
#include <boost/gil/gil_all.hpp>
         ^~~~~~~~~~~~~~~~~~~~~~~
src/video_frame.cpp:19:10: fatal error: 'boost/gil/gil_all.hpp' file not found
#include <boost/gil/gil_all.hpp>
         ^~~~~~~~~~~~~~~~~~~~~~~
src/colour_button.cpp:21:10: fatal error: 'boost/gil/gil_all.hpp' file not found
#include <boost/gil/gil_all.hpp>
         ^~~~~~~~~~~~~~~~~~~~~~~
src/video_provider_dummy.cpp:48:10: fatal error: 'boost/gil/gil_all.hpp' file not found
#include <boost/gil/gil_all.hpp>
         ^~~~~~~~~~~~~~~~~~~~~~~

Crashes on Linux when Kara Templater can't evaluate an expression

With a script as simple as follows that produces an exception on the arithmetic (attempt to perform arithmetic on nil), Aegisub crashes when the kara templater is run.

Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,template line,{\pos($x,!y + $y!)}
Dialogue: 0,0:00:05.00,0:00:07.00,Default,,0,0,0,,abcd

This is on Arch Linux with my own fork, built with meson. I can try to reproduce it on master as well, if nobody else is able to.
Running the latest release on http://plorkyeran.com/aegisub/ in wine works fine here, but crashes for some other script (that I didn't investigate further because we are only interested in the native runtime, I presume).

When it occurs, my terminal (stdout) has this to say:

terminate called after throwing an instance of 'agi::lua::error_tag'

Update: Someone confirmed they weren't able to reproduce with a slightly out of date master build. I'll recheck myself later.

Problem building current git source when using the bundled LuaJIT

After downloading the current git version, running autogen.sh, configure and make I get the following error:

cd /tmp/aegisub-3.2.100/aegisub-3.2.100_GIT20180807_0524/src/libresrc; ./vendor/luajit/src/host/minilua /tmp/aegisub-3.2.100/aegisub-3.2.100_GIT20180807_0524/tools/respack.lua ../bitmaps/manifest.respack bitmap.cpp bitmap.h
/bin/sh: ./vendor/luajit/src/host/minilua: No such file or directory
make: *** [/tmp/aegisub-3.2.100/aegisub-3.2.100_GIT20180807_0524/src/libresrc/Makefile:19: /tmp/aegisub-3.2.100/aegisub-3.2.100_GIT20180807_0524/src/libresrc/bitmap.h] Error 12

The minilua programs seems to be properly built and marked executable before attempting to use it.
The problem seems to be that configure assigns srcdir="." instead of full path. Then the program is called from sub/subdirectory.

The "." value is assigned by the configure itself, when we have same physical and logical path (aka, no symlinks in the path). It does so even when using explicit configure --subdir=/tmp/aegisub-3.2.100/aegisub-3.2.100_GIT20180807_0524
Manually editing Makefile.inc to put the full path, allows the compilation to continue.

Since the git source does not come with configure, and configure.ac handles the srcdir with a single line AC_CONFIG_SRCDIR([src/main.cpp]).
It looks like this is the intended behavior on autoconf side.

I'm not really sure how this should be fixed.
There is $abs_srcdir, however that is exported only to the Makefile. Inside configure only the internal variable $ac_abs_scrdir exists.

I believe I have fairly recent auto-tools: autoconf-2.69, automake-1.16.1.

Don't generate furigana styles when they aren't needed

Out of the 30-something karaokes I have worked on so far, I have used furigana styles exactly once (to imitate the burned-in subs of a different raw when we switched raw providers).

Been on my todo for I don't know how many years, but especially in scripts with many styles this is incredibly annoying.
Apparently furigana styles also aren't regenerated when they exist already, even when the source style has changed (according to jfs on IRC).

macOS: Audio volume/zoom sliders are broken

A certain macOS update triggered a possible latent bug in wxWidgets, which causes the audio box sliders used for volume control and zoom to malfunction.

The sliders appear to get created as horizontal sliders instead of vertical ones, so they have very little or no movement possible. This causes any attempt to manipulate them to set the function to minimum or maximum.

src/audio_box.cpp lines 66-68 are likely the culprit, changing the creation flags for the slider controls have fixed the bug in a previous test I made, but I didn't test it on other platforms, or get a fully functional build on macOS either.

[Solved] Unable to apply karaoke templates

Runtime error in template code: Expected 1 arguments, got 2
Code producing error: ci = { 0 }; cn = _G.unicode.len(orgline.text_stripped:gsub(" ",""))

This error occurs in the v88+ builds, at least (I didn't try any earlier build). v3.2.2 is ok for both x32/x64 versions. Maybe an issue in the lua interpreter ?

Mac: Audio sliders are unreliable

On Aegisub 3.2.2 on macOS 10.13.4, the three audio sliders are unreliable; trying to interact with them seems to bring the relevant value to the maximum or minimum.

It also seems that they are visually missing their tracks – and a zero-size track would probably lead to the behavior I'm seeing.

screen shot 2018-06-11 at 17 44 25

Add Hotkey failed using Chinese Language

When I add a new hotkey, aegisub will save it.
But when I open the hotkey setting again, the new hot key is classified as a new one.
For example, if I add a hotkey "Ctrl-Left" under "Audio", which it'll be displayed as "音频" in Chinese,
the second time I open hotkey setting, there will be two "音频" hotkey node.
I opened the hotkey.json, and the new hotkey is not inside "Audio" node, but inside "音频" node, as shown:

...
	"Audio" : {
		"app/toggle/global_hotkeys" : [
			"Ctrl-KP_Multiply"
		],
		...
		"time/prev" : [
			"Left",
			"Z"
		]
	},		
	"音频" : {
		"time/prev" : [
			"Ctrl-Left"
		]
	}
}

I think aegisub saved the json node using display language,

Shortcut actions for instant color picking

It is currently possible to open the color chooser dialogs via shortcut actions, but I want to be able to instantly pick colors from the video display without the dialog clicking inbetween.

Ability to Map Mouse Buttons as Hotkeys

I would like to be able to map the extra mouse buttons as hotkeys. For example, I would like to map Mouse5 as "commit" and Mouse4 as "previous line" for timing purposes.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.