比如 (sdl-message "Hello")
打开一个 GUI 窗口,显示 Hello,用户点击关闭窗口后回到 Emacs。
是不是要创建一个 thread 之类的,退出的时候不能把 Emacs 给关了,不懂
比如 (sdl-message "Hello")
打开一个 GUI 窗口,显示 Hello,用户点击关闭窗口后回到 Emacs。
是不是要创建一个 thread 之类的,退出的时候不能把 Emacs 给关了,不懂
背后一定有个神奇的想法
实际上可以的,只要你能用dynamic module和Elisp写出接口就行
我 试了下 发现有问题,窗口是可以打开,也能操作,但是窗口退出之后 Emacs 就用不了(完全卡住了),好像是 OpenGL 只能从 main thread 使用(不清楚什么意思):
[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.
$ emacs -Q -nw -l raylib-module.so --eval "(thread-join (make-thread #'raylib-module-basic-window))"
INFO: Initializing raylib 2.5
2020-04-05 07:56:16.122 emacs[72487:1147744] *** Assertion failure in +[NSUndoManager _endTopLevelGroupings], /AppleInternal/BuildRoot/Library/Caches/com.apple.xbs/Sources/Foundation/Foundation-1675.129/Foundation/Misc.subproj/NSUndoManager.m:363
2020-04-05 07:56:16.123 emacs[72487:1147744]
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: '+[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.'
*** First throw call stack:
0 CoreFoundation 0x00007fff2dea7d07 __exceptionPreprocess + 250
1 libobjc.A.dylib 0x00007fff66bcc5bf objc_exception_throw + 48
2 CoreFoundation 0x00007fff2ded0ec8 +[NSException raise:format:arguments:] + 88
3 Foundation 0x00007fff305bbf3d -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 191
4 Foundation 0x00007fff304f86ce +[NSUndoManager(NSPrivate) _endTopLevelGroupings] + 440
5 AppKit 0x00007fff2b0992bc -[NSApplication run] + 864
6 libraylib.2.dylib 0x0000000112fb0d44 _glfwPlatformCreateWindow + 81
7 libraylib.2.dylib 0x0000000112faba3b glfwCreateWindow + 460
8 libraylib.2.dylib 0x0000000112f51f95 InitWindow + 621
9 raylib-module.so 0x0000000110c16d7e Fbasic_window + 46
10 emacs 0x000000010fd765e5 funcall_module + 437
11 emacs 0x000000010fd48e0f Ffuncall + 751
12 emacs 0x000000010fdb8588 invoke_thread_function + 56
13 emacs 0x000000010fd47487 internal_condition_case + 263
14 emacs 0x000000010fdb7e0b run_thread + 155
15 libsystem_pthread.dylib 0x00007fff67f78109 _pthread_start + 148
16 libsystem_pthread.dylib 0x00007fff67f73b8b thread_start + 15)
libc++abi.dylib: terminating with uncaught exception of type NSException
我用 raylib 测试的,但是 libsdl 估计有同样问题,好像它们都用 OpenGL。
所有的图形系统都是在子线程计算好以后,把子线程的结果发送给主线程,由主线程进行渲染。
你不能在子线程直接调任何图形接口的代码。
一直希望emacs能支持一种自绘制窗口, 就是由用户来提供绘制函数, emacs需要绘制的时候直接调用户的绘制函数, 传入窗口信息, 其他什么都不做.
那不就是EAF吗?
差不多, 可以用lisp来画图, 比如可以用来画图. 不过细想发现要提供的api太多了, 几乎不可能实现, 而且性能不好. EAF可能更简单.