Emacs dynamic module 能不能用 SDL 创建一个窗口?

比如 (sdl-message "Hello") 打开一个 GUI 窗口,显示 Hello,用户点击关闭窗口后回到 Emacs。

是不是要创建一个 thread 之类的,退出的时候不能把 Emacs 给关了,不懂

背后一定有个神奇的想法 :laughing:

实际上可以的,只要你能用dynamic module和Elisp写出接口就行

试了下 发现有问题,窗口是可以打开,也能操作,但是窗口退出之后 Emacs 就用不了(完全卡住了),好像是 OpenGL 只能从 main thread 使用(不清楚什么意思):

[NSUndoManager(NSInternal) _endTopLevelGroupings] is only safe to invoke on the main thread.

backtrace
$ 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。

所有的图形系统都是在子线程计算好以后,把子线程的结果发送给主线程,由主线程进行渲染。

你不能在子线程直接调任何图形接口的代码。

2 个赞

一直希望emacs能支持一种自绘制窗口, 就是由用户来提供绘制函数, emacs需要绘制的时候直接调用户的绘制函数, 传入窗口信息, 其他什么都不做.

那不就是EAF吗?:slight_smile:

差不多, 可以用lisp来画图, 比如可以用来画图. 不过细想发现要提供的api太多了, 几乎不可能实现, 而且性能不好. EAF可能更简单.