lem icon indicating copy to clipboard operation
lem copied to clipboard

Lem 2.0 crashes on SDL event (?), Linux Mint 21, 64 bit

Open maximinus opened this issue 1 year ago • 20 comments

Download Lem 2.0 from https://github.com/lem-project/lem/releases/download/v2.0.0/lem-linux-v2.0.0.tar.gz

Extracting and running ./lem opens a blank black window. Any keypress or mouse move will close the window and exit Lem.

The error.log in ./lem reports:

The value
  NIL
is not of type
  AUTOWRAP:WRAPPER
Backtrace for: #<SB-THREAD:THREAD tid=7276 "editor" RUNNING {1004CD9BB3}>
0: (AUTOWRAP:INVALIDATE NIL)
1: ((:METHOD LEM-SDL2::RESIZE (LEM-SDL2::VIEW T T)) #<LEM-SDL2::VIEW {10067E8DA3}> 50 1) [fast-method]
2: ((FLET "WITHOUT-INTERRUPTS-BODY-11" :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))
3: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK #<FUNCTION (FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN LEM-SDL2::CALL-WITH-RENDERER) {7FA949ACE1EB}> #<SB-THREAD:MUTEX "lem-sdl2 display mutex" taken owner=editor> T NIL)
4: (LEM-SDL2::CALL-WITH-RENDERER #<FUNCTION (LAMBDA NIL :IN LEM-INTERFACE:SET-VIEW-SIZE) {10067F2BFB}>)
5: (LEM-SDL2::CALL-WITH-DEBUG #<FUNCTION (LAMBDA NIL :IN LEM-INTERFACE:SET-VIEW-SIZE) {10067F2B9B}> #<FUNCTION (LAMBDA NIL :IN LEM-INTERFACE:SET-VIEW-SIZE) {10067F2BCB}>)
6: (LEM::SCREEN-SET-SIZE #S(LEM::SCREEN :VIEW #<LEM-SDL2::VIEW {10067E8DA3}> :MODELINE-ELEMENTS NIL :LEFT-LINES #(NIL) :LEFT-WIDTH NIL :OLD-LEFT-WIDTH NIL :LINES #(NIL) :OLD-LINES #(NIL) :WRAP-LINES NIL :WIDTH 50 :MODIFIED-P T :LAST-BUFFER-NAME NIL :LAST-BUFFER-MODIFIED-TICK NIL ...) 50 1)
7: ((:METHOD LEM/POPUP-WINDOW::ADJUST-FOR-REDRAWING (LEM/POPUP-WINDOW::GRAVITY-FOLLOW-CURSOR T)) #<unused argument> #<LEM/POPUP-WINDOW::POPUP-WINDOW {10067E8C73}>) [fast-method]
8: ((:METHOD LEM:WINDOW-REDRAW (LEM/POPUP-WINDOW::POPUP-WINDOW T)) #<LEM/POPUP-WINDOW::POPUP-WINDOW {10067E8C73}> NIL) [fast-method]
9: (LEM:REDRAW-DISPLAY NIL)
10: (LEM::COMMAND-LOOP-BODY)
11: (LEM::COMMAND-LOOP)
12: (LEM::TOPLEVEL-COMMAND-LOOP #<FUNCTION (LAMBDA NIL :IN LEM::RUN-EDITOR-THREAD) {1005928CDB}>)
13: ((LAMBDA NIL :IN LEM::RUN-EDITOR-THREAD))
14: ((LAMBDA NIL :IN LEM::RUN-EDITOR-THREAD))
15: ((LAMBDA NIL :IN BORDEAUX-THREADS::BINDING-DEFAULT-SPECIALS))
16: ((FLET SB-UNIX::BODY :IN SB-THREAD::RUN))
17: ((FLET "WITHOUT-INTERRUPTS-BODY-156" :IN SB-THREAD::RUN))
18: ((FLET SB-UNIX::BODY :IN SB-THREAD::RUN))
19: ((FLET "WITHOUT-INTERRUPTS-BODY-149" :IN SB-THREAD::RUN))
20: (SB-THREAD::RUN)
21: ("foreign function: call_into_lisp_")
22: ("foreign function: funcall1")

maximinus avatar May 23 '23 13:05 maximinus

Thanks for the report. I am not sure about this error, but maybe there is an error during error handling. Is there any log output before this log?

cxxxr avatar May 23 '23 15:05 cxxxr

Seeing the exact same behavior on Fedora 37, although I don't see an error.log file anywhere.

karbak avatar May 23 '23 16:05 karbak

There is no other error, this is the only content in error.log. Also no output on the command line.

@karbak : the error.log is ~./lem/error.log

maximinus avatar May 23 '23 20:05 maximinus

Umm, I have no idea why that would be the case.

Is it because of what is written in the known issues? https://github.com/lem-project/lem/releases/tag/v2.0.0

The SDL2 frontend may not work with certain graphic drivers, especially when installing graphic drivers on Linux.

cxxxr avatar May 24 '23 03:05 cxxxr

I got the same error in my ~/.lem/error.log but I never saw a window. I'm running Guix with Sway (wayland only). I loaded lem through an emacs slime sbcl prompt with (ql:quickload :lem-sdl2) (lem's git in my local-projects) and (lem:lem). I did get a failure loading libffi.so--and restarted with use-value ("libffi.so.8"). It was looking for libffi.so.7 I think.

I'll have to read up on how to debug this sort of thing. I guess lem was calling destroy-texture on nil?

timmydo avatar May 24 '23 06:05 timmydo

I tested on a different machine - Ubuntu 22.04 with an i915 Intel driver and Lem 2.0 worked. The graphics drivers on the machine with the issue were the latest Nvidia proprietary drivers, so it looks like that could indeed be the issue.

The next question is "why?". SDL programs normally work on my machine and SDL itself is generally a solid and well-tested library. Perhaps the error is in the Lisp wrapper?

Do we know why SDL has issues with some linux drivers? I couldn't find any relevant issues on the SDL2 repo.

On Wed, 24 May 2023 at 07:09, Timmy Douglas @.***> wrote:

I got the same error in my ~/.lem/error.log but I never saw a window. I'm running Guix with Sway (wayland only). I loaded lem through an emacs slime sbcl prompt with (ql:quickload :lem-sdl2) (lem's git in my local-projects) and (lem:lem). I did get a failure loading libffi.so--and restarted with use-value ("libffi.so.8"). It was looking for libffi.so.7 I think.

I'll have to read up on how to debug this sort of thing. I guess lem was calling destroy-texture on nil?

— Reply to this email directly, view it on GitHub https://github.com/lem-project/lem/issues/630#issuecomment-1560508701, or unsubscribe https://github.com/notifications/unsubscribe-auth/AADKGT7HCIXSCTAPGTUJOKDXHWQ2BANCNFSM6AAAAAAYL5LLVI . You are receiving this because you authored the thread.Message ID: @.***>

maximinus avatar May 24 '23 09:05 maximinus

Thank you for testing the functionality.

Perhaps the error is in the Lisp wrapper?

Indeed, I believe there is an issue with how Lem is using sdl2. However, I'm unable to reproduce it on my own environment. I'm using Ubuntu with an AMD GPU, but I wonder if installing the dedicated driver would allow me to reproduce the issue.

cxxxr avatar May 25 '23 12:05 cxxxr

Indeed, I believe there is an issue with how Lem is using sdl2.

i think it stems from (screen-view screen) on line 42 of screen.lisp returning nil, but my lisp skills are weak and i couldn't trace back the implementation of lem::screen-view. I'm willing to try running something on my local machine for you if that would help. Otherwise I don't see how this would ever get fixed.

maximinus avatar May 25 '23 13:05 maximinus

Hmm, that's puzzling. It's possible that there might be an error with SDL2-related operations before the value is stored in the screen-view, and it could be causing the uninitialized state when displaying the error result on the screen.

cxxxr avatar May 25 '23 13:05 cxxxr

Just a quick update--I noticed if I remove bt:make-thread from both lem-if:invoke and run-editor-thread, the editor window pops up with a 0: *tmp* tab and a mode line if I run (ql:quickload :lem-sdl2) (lem:lem) from emacs/slime. I'm not able to type anything or kill the window (presumably the event loop doesn't work in this single threaded state). So my guess is this is related to threading or something after the event loop start rather than graphics drivers?

timmydo avatar Jun 01 '23 06:06 timmydo

Also using Nvidia proprietary drivers, also getting this crash with this backtrace. I'm on Debian unstable with X, using the i3 window manager.

jaredjennings avatar Jun 23 '23 13:06 jaredjennings

If I put a breakpoint on lem-core:message:

breaking before traced call to LEM-CORE:MESSAGE:
   [Condition of type SIMPLE-CONDITION]

Restarts:
 0: [CONTINUE] Return from BREAK.
 1: [ABORT] abort thread (#<THREAD tid=24067 "editor" RUNNING {100F83E963}>)

Backtrace:
 0: ((LAMBDA (LEM-CORE::E) :IN LEM-CORE::CALL-WITH-DISPLAY-ERROR) #<SDL2::SDL-RC-ERROR {10077400A3}>)
 1: (SB-KERNEL::%SIGNAL #<SDL2::SDL-RC-ERROR {10077400A3}>)
 2: (ERROR SDL2::SDL-RC-ERROR :RC -1 :STRING "glFramebufferTexture2DEXT() failed")
 3: (SDL2:SET-RENDER-TARGET #<SDL2-FFI:SDL-RENDERER {#X7FEF3C2CA310}> #<SDL2-FFI:SDL-TEXTURE {#X7FEF04001860}>)
 4: (LEM-SDL2::RENDER-FILL-RECT #<SDL2-FFI:SDL-TEXTURE {#X7FEF04001860}> 0 0 100 1 :COLOR #S(LEM-CORE::COLOR :RED 45 :GREEN 45 :BLUE 45))
 5: ((:METHOD LEM-SDL2::CLEAR-EOL (LEM-SDL2::VIEW T T)) #<LEM-SDL2::VIEW {1007286193}> 0 0) [fast-method]
 6: ((LAMBDA NIL :IN LEM-INTERFACE:CLEAR-EOL))
 7: ((FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN LEM-SDL2::CALL-WITH-RENDERER))
 8: ((FLET "WITHOUT-INTERRUPTS-BODY-11" :IN SB-THREAD::CALL-WITH-RECURSIVE-LOCK))
 9: (SB-THREAD::CALL-WITH-RECURSIVE-LOCK #<FUNCTION (FLET SB-THREAD::WITH-RECURSIVE-LOCK-THUNK :IN LEM-SDL2::CALL-WITH-RENDERER) {7FEF257452AB}> #<SB-THREAD:MUTEX "lem-sdl2 display mutex" taken owner=edit..
10: (LEM-SDL2::CALL-WITH-RENDERER #<FUNCTION (LAMBDA NIL :IN LEM-INTERFACE:CLEAR-EOL) {100771FDEB}>)
11: ((LAMBDA NIL :IN LEM-INTERFACE:CLEAR-EOL))
12: (LEM-SDL2::CALL-WITH-DEBUG #<FUNCTION (LAMBDA NIL :IN LEM-INTERFACE:CLEAR-EOL) {100771FD8B}> #<FUNCTION (LAMBDA NIL :IN LEM-INTERFACE:CLEAR-EOL) {100771FDBB}>)
13: ((:METHOD LEM-INTERFACE:CLEAR-EOL (LEM-SDL2::SDL2 T T T)) #<unused argument> #<LEM-SDL2::VIEW {1007286193}> 0 0) [fast-method]
14: (LEM-CORE::SCREEN-DISPLAY-LINE #S(LEM-CORE::SCREEN :VIEW #<LEM-SDL2::VIEW {1007286193}> :MODELINE-ELEMENTS NIL :LEFT-LINES #(NIL) :LEFT-WIDTH 0 :OLD-LEFT-WIDTH NIL :LINES #(("  0: *EDITOR ERROR*      ..
15: ((LAMBDA NIL :IN LEM-CORE::SCREEN-DISPLAY-LINES))
16: (LEM-CORE::CALL-WITH-DISPLAY-ERROR #<FUNCTION (LAMBDA NIL :IN LEM-CORE::SCREEN-DISPLAY-LINES) {100771FD4B}>)
17: (LEM-CORE::SCREEN-DISPLAY-LINES #S(LEM-CORE::SCREEN :VIEW #<LEM-SDL2::VIEW {1007286193}> :MODELINE-ELEMENTS NIL :LEFT-LINES #(NIL) :LEFT-WIDTH 0 :OLD-LEFT-WIDTH NIL :LINES #(("  0: *EDITOR ERROR*     ..
18: ((LAMBDA NIL :IN LEM-CORE::REDRAW-BUFFER))
19: (LEM-CORE::CALL-WITH-DISPLAY-ERROR #<FUNCTION (LAMBDA NIL :IN LEM-CORE::REDRAW-BUFFER) {100771F5FB}>)
20: ((:METHOD LEM-CORE::REDRAW-BUFFER (LEM-BASE:TEXT-BUFFER T T)) #<LEM-BASE:TEXT-BUFFER *frame-multiplexer* NIL {1007239C43}> #<LEM/FRAME-MULTIPLEXER::VIRTUAL-FRAME {1007283443}> NIL) [fast-method]
21: (LEM-CORE::REDRAW-DISPLAY-WINDOW #<LEM/FRAME-MULTIPLEXER::VIRTUAL-FRAME {1007283443}> NIL)
22: ((:METHOD LEM-CORE:WINDOW-REDRAW (T T)) #<LEM/FRAME-MULTIPLEXER::VIRTUAL-FRAME {1007283443}> NIL) [fast-method]
23: ((FLET CALL-NEXT-METHOD :IN "/home/timmy/quicklisp/local-projects/lem/src/ext/frame-multiplexer.lisp"))
24: ((:METHOD LEM-CORE:WINDOW-REDRAW (LEM/FRAME-MULTIPLEXER::VIRTUAL-FRAME T)) #<LEM/FRAME-MULTIPLEXER::VIRTUAL-FRAME {1007283443}> NIL) [fast-method]
25: ((LABELS LEM-CORE::REDRAW-HEADER-WINDOWS :IN LEM-CORE:REDRAW-DISPLAY) NIL)
26: ((LABELS LEM-CORE::REDRAW-ALL-WINDOWS :IN LEM-CORE:REDRAW-DISPLAY))
27: (LEM-CORE:REDRAW-DISPLAY NIL)
28: ((FLET LEM-CORE::REDRAW :IN LEM-CORE::COMMAND-LOOP-BODY))
29: (LEM-CORE::COMMAND-LOOP-BODY)
30: (LEM-CORE:COMMAND-LOOP)
31: (LEM-CORE::TOPLEVEL-COMMAND-LOOP #<FUNCTION (LAMBDA NIL :IN LEM-CORE::RUN-EDITOR-THREAD) {100190100B}>)
32: ((LAMBDA NIL :IN LEM-CORE::RUN-EDITOR-THREAD))
33: (LEM/COMMON/TIMER::CALL-WITH-TIMER-MANAGER #<LEM-CORE::LEM-TIMER-MANAGER {100F945963}> #<FUNCTION (LAMBDA NIL :IN LEM-CORE::RUN-EDITOR-THREAD) {100F971FCB}>)
34: ((LAMBDA NIL :IN LEM-CORE::RUN-EDITOR-THREAD))
35: ((LABELS BORDEAUX-THREADS::%BINDING-DEFAULT-SPECIALS-WRAPPER :IN BORDEAUX-THREADS::BINDING-DEFAULT-SPECIALS))
36: ((FLET SB-UNIX::BODY :IN SB-THREAD::RUN))
37: ((FLET "WITHOUT-INTERRUPTS-BODY-156" :IN SB-THREAD::RUN))
38: ((FLET SB-UNIX::BODY :IN SB-THREAD::RUN))
39: ((FLET "WITHOUT-INTERRUPTS-BODY-149" :IN SB-THREAD::RUN))
40: (SB-THREAD::RUN)
41: ("foreign function: call_into_lisp_")
42: ("foreign function: funcall1")

I get a few more hits also with: LEM-SDL2::RENDER-VIEW-TEXTURE-TO-DISPLAY before the editor thread exits. I tried inserting some code (format t "pixel-format ~S~%" (sdl2:get-window-pixel-format window)) which is :RGB888 on my computer. I didn't have any luck changing create-texture to use different formats or removing :accelerated from the sdl2 init.

https://github.com/libsdl-org/SDL/blob/87e916dd214866af9cfd67eb4618918bc8b0f1b4/src/render/opengl/SDL_render_gl.c#L888

timmydo avatar Jun 25 '23 21:06 timmydo

https://github.com/lem-project/lem/pull/787 Wouldn't this work?

cxxxr avatar Jun 27 '23 13:06 cxxxr

Thanks @cxxxr . I don't see the exception anymore but the main window never opens.

Here is what I see from the two threads if I break into them:

editor thread:
   [Condition of type SIMPLE-ERROR]

Restarts:
 0: [CONTINUE] Continue from break.
 1: [ABORT] abort thread (#<THREAD tid=23196 "editor" RUNNING {100E434523}>)

Backtrace:
 0: ("bogus stack frame")
 1: ((FLET SB-UNIX::BODY :IN SB-THREAD::FUTEX-WAIT))
 2: ((FLET "WITHOUT-INTERRUPTS-BODY-2" :IN SB-THREAD::%CONDITION-WAIT))
 3: (SB-THREAD:CONDITION-WAIT #<SB-THREAD:WAITQUEUE Anonymous condition variable {1002B86BB3}> #<SB-THREAD:MUTEX "Anonymous lock" free owner=0> :TIMEOUT NIL)
 4: (BORDEAUX-THREADS:CONDITION-WAIT #<SB-THREAD:WAITQUEUE Anonymous condition variable {1002B86BB3}> #<SB-THREAD:MUTEX "Anonymous lock" free owner=0> :TIMEOUT NIL)
 5: ((FLET SB-THREAD::WITH-MUTEX-THUNK :IN LEM-CORE::DEQUEUE-EVENT))
 6: ((FLET "WITHOUT-INTERRUPTS-BODY-1" :IN SB-THREAD::CALL-WITH-MUTEX))
 7: (SB-THREAD::CALL-WITH-MUTEX #<FUNCTION (FLET SB-THREAD::WITH-MUTEX-THUNK :IN LEM-CORE::DEQUEUE-EVENT) {7FE3D20DDB7B}> #<SB-THREAD:MUTEX "Anonymous lock" free owner=0> T NIL)
 8: (LEM-CORE::DEQUEUE-EVENT NIL #S(LEM-CORE::EVENT-QUEUE :WAIT #<SB-THREAD:WAITQUEUE Anonymous condition variable {1002B86BB3}> :LOCK #<SB-THREAD:MUTEX "Anonymous lock" free owner=0> :QUEUE (NIL #<FUNCTI..
 9: (LEM-CORE:RECEIVE-EVENT NIL)
10: (LEM-CORE::READ-EVENT-INTERNAL :ACCEPT-KEY T :ACCEPT-MOUSE T)
11: (LEM-CORE::READ-EVENT-WITH-RECORDING-AND-RUN-HOOKS :ACCEPT-KEY T :ACCEPT-MOUSE T)
12: (LEM-CORE:READ-EVENT)
13: (LEM-CORE:READ-COMMAND)
14: ((LAMBDA NIL :IN LEM-CORE::COMMAND-LOOP-BODY))
15: (LEM/COMMON/TIMER::CALL-WITH-IDLE-TIMERS #<FUNCTION (LAMBDA NIL :IN LEM-CORE::COMMAND-LOOP-BODY) {53F8B40B}>)
16: ((FLET LEM-CORE::READ-COMMAND-AND-CALL :IN LEM-CORE::COMMAND-LOOP-BODY))
17: (LEM-CORE::COMMAND-LOOP-BODY)
18: (LEM-CORE:COMMAND-LOOP)


SDL2 Main Thread:Interrupt from Emacs
   [Condition of type SIMPLE-ERROR]

Restarts:
 0: [CONTINUE] Continue from break.
 1: [CONTINUE] Return to the SDL2 main loop.
 2: [ABORT] Abort, quitting SDL2 entirely.
 3: [ABORT] abort thread (#<THREAD tid=23185 "SDL2 Main Thread" RUNNING {10103E81B3}>)

Backtrace:
 0: ("bogus stack frame")
 1: (SDL2:NEXT-EVENT #<SDL2-FFI:SDL-EVENT {#X7FE3D8A47010}> :WAIT NIL)
 2: ((LAMBDA NIL :IN LEM-SDL2::EVENT-LOOP))
 3: (LEM-SDL2::EVENT-LOOP)
 4: ((LAMBDA NIL :IN LEM-SDL2::CREATE-DISPLAY))
 5: (SDL2::HANDLE-MESSAGE (#<FUNCTION (LAMBDA NIL :IN LEM-SDL2::CREATE-DISPLAY) {100E0C830B}> . #S(TRIVIAL-CHANNELS:CHANNEL :QUEUE #S(TRIVIAL-CHANNELS.QUEUE:QUEUE :HEAD NIL :TAIL NIL) :Q-CONDITION #<SB-TH..
 6: (SDL2::RECV-AND-HANDLE-MESSAGE)
 7: (SDL2::SDL-MAIN-THREAD)
 8: ((LABELS BORDEAUX-THREADS::%BINDING-DEFAULT-SPECIALS-WRAPPER :IN BORDEAUX-THREADS::BINDING-DEFAULT-SPECIALS))
 9: ((FLET SB-UNIX::BODY :IN SB-THREAD::RUN))
10: ((FLET "WITHOUT-INTERRUPTS-BODY-156" :IN SB-THREAD::RUN))
11: ((FLET SB-UNIX::BODY :IN SB-THREAD::RUN))
12: ((FLET "WITHOUT-INTERRUPTS-BODY-149" :IN SB-THREAD::RUN))
13: (SB-THREAD::RUN)
14: ("foreign function: call_into_lisp_")
15: ("foreign function: funcall1")
 --more--

If I had to guess, maybe there is an issue with the threading/window events at startup? I'm using sway (no xwayland) on Guix running on an AMD 5700G.

timmydo avatar Jun 27 '23 16:06 timmydo

Can I see a log file with launching lem (lem:lem "--debug" "--log-filename" "lem.log") ? It may be useful to debug this issue when these conditions are signaled.

To get log files, this page may help you: https://github.com/lem-project/lem/wiki/How-to-hack-on-lem-itself

t-sin avatar Jul 14 '23 10:07 t-sin

@t-sin this is currently on git commit c0e562ade3382ec0ab04125fbe8c17e69b37d465

 <INFO> [17:15:50] lem-core lem.lisp (lem) - Starting Lem
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-height sdl2) -
  lem-if:display-height
<DEBUG> [17:15:50] lem-sdl2 main.lisp (make-view sdl2) -
  lem-if:make-view LEM-SDL2::WINDOW: #<LEM-CORE:WINDOW {1010211FF3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0 LEM-SDL2::WIDTH: 100 LEM-SDL2::HEIGHT: 39
  LEM-SDL2::USE-MODELINE: T 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-height sdl2) -
  lem-if:display-height
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-height sdl2) -
  lem-if:display-height
<DEBUG> [17:15:50] lem-sdl2 main.lisp (make-view sdl2) -
  lem-if:make-view LEM-SDL2::WINDOW: #<LEM/POPUP-WINDOW::POPUP-WINDOW {10065DC573}>
  LEM-SDL2::X: 1 LEM-SDL2::Y: 2 LEM-SDL2::WIDTH: 44 LEM-SDL2::HEIGHT: 1
  LEM-SDL2::USE-MODELINE: NIL 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-height sdl2) -
  lem-if:display-height
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (make-view sdl2) -
  lem-if:make-view LEM-SDL2::WINDOW: #<LEM/FRAME-MULTIPLEXER::VIRTUAL-FRAME {1006BEB433}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0 LEM-SDL2::WIDTH: 100 LEM-SDL2::HEIGHT: 40
  LEM-SDL2::USE-MODELINE: NIL 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (update-foreground sdl2) -
  lem-if:update-foreground LEM-SDL2::COLOR: "#cccccc" 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (update-background sdl2) -
  lem-if:update-background LEM-SDL2::COLOR: "#2d2d2d" 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (delete-view sdl2) - lem-if:delete-view
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (set-view-size sdl2) -
  lem-if:set-view-size LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}>
  LEM-SDL2::WIDTH: 100 LEM-SDL2::HEIGHT: 1 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-height sdl2) -
  lem-if:display-height
<DEBUG> [17:15:50] lem-sdl2 main.lisp (set-view-size sdl2) -
  lem-if:set-view-size LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::WIDTH: 100 LEM-SDL2::HEIGHT: 38 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (set-view-pos sdl2) -
  lem-if:set-view-pos LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 1 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (will-update-display sdl2) -
  will-update-display
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (clear-eol sdl2) -
  lem-if:clear-eol LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print sdl2) -
  lem-if:print LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> LEM-SDL2::X: 0
  LEM-SDL2::Y: 0 STRING: " "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM/FRAME-MULTIPLEXER::FRAME-MULTIPLEXER-BACKGROUND-ATTRIBUTE
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print sdl2) -
  lem-if:print LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> LEM-SDL2::X: 1
  LEM-SDL2::Y: 0 STRING: " 0: *tmp* "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM/FRAME-MULTIPLEXER::FRAME-MULTIPLEXER-ACTIVE-FRAME-NAME-ATTRIBUTE
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print sdl2) -
  lem-if:print LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> LEM-SDL2::X: 11
  LEM-SDL2::Y: 0
  STRING: "                                                                                         "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM/FRAME-MULTIPLEXER::FRAME-MULTIPLEXER-BACKGROUND-ATTRIBUTE
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print sdl2) -
  lem-if:print LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> LEM-SDL2::X: 0
  LEM-SDL2::Y: 0 STRING: " " LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:CURSOR 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (clear-eol sdl2) -
  lem-if:clear-eol LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 1 LEM-SDL2::Y: 0 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (clear-eob sdl2) -
  lem-if:clear-eob LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 1 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0
  STRING: "                                                                                                    "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0 STRING: "  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 2 LEM-SDL2::Y: 0 STRING: "   "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 5 LEM-SDL2::Y: 0 STRING: "*tmp*"
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (orange #404040) bold {10073E12F3}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 93 LEM-SDL2::Y: 0 STRING: "  All  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (black #A0A0A0) bold {10073E1393}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: " 1:0 "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FAFAFA #202020) bold {10073E1433}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: ""
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FFFFFF #404040) bold {10073E16C3}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 76 LEM-SDL2::Y: 0 STRING: "Fundamental "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#85b8ff #404040) bold {10073E1C83}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (update-display sdl2) -
  lem-if:update-display
<DEBUG> [17:15:50] lem-sdl2 main.lisp (will-update-display sdl2) -
  will-update-display
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-height sdl2) -
  lem-if:display-height
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (clear-eob sdl2) -
  lem-if:clear-eob LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 1 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0
  STRING: "                                                                                                    "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0 STRING: "  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 2 LEM-SDL2::Y: 0 STRING: "   "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 5 LEM-SDL2::Y: 0 STRING: "*tmp*"
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (orange #404040) bold {1007562A33}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 93 LEM-SDL2::Y: 0 STRING: "  All  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (black #A0A0A0) bold {1007562A83}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: " 1:0 "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FAFAFA #202020) bold {1007562AD3}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: ""
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FFFFFF #404040) bold {1007562B23}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 76 LEM-SDL2::Y: 0 STRING: "Fundamental "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#85b8ff #404040) bold {1007562BE3}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (update-display sdl2) -
  lem-if:update-display
<DEBUG> [17:15:50] lem-sdl2 main.lisp (will-update-display sdl2) -
  will-update-display
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-height sdl2) -
  lem-if:display-height
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (clear-eob sdl2) -
  lem-if:clear-eob LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 1 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0
  STRING: "                                                                                                    "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0 STRING: "  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 2 LEM-SDL2::Y: 0 STRING: "   "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 5 LEM-SDL2::Y: 0 STRING: "*tmp*"
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (orange #404040) bold {1007566113}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 93 LEM-SDL2::Y: 0 STRING: "  All  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (black #A0A0A0) bold {1007566163}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: " 1:0 "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FAFAFA #202020) bold {10075661B3}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: ""
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FFFFFF #404040) bold {1007566203}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 76 LEM-SDL2::Y: 0 STRING: "Fundamental "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#85b8ff #404040) bold {1007566253}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (update-display sdl2) -
  lem-if:update-display
<DEBUG> [17:15:50] lem-sdl2 main.lisp (will-update-display sdl2) -
  will-update-display
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-height sdl2) -
  lem-if:display-height
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (clear-eob sdl2) -
  lem-if:clear-eob LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 1 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0
  STRING: "                                                                                                    "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0 STRING: "  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 2 LEM-SDL2::Y: 0 STRING: "   "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 5 LEM-SDL2::Y: 0 STRING: "*tmp*"
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (orange #404040) bold {1007566853}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 93 LEM-SDL2::Y: 0 STRING: "  All  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (black #A0A0A0) bold {10075668A3}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: " 1:0 "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FAFAFA #202020) bold {10075668F3}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: ""
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FFFFFF #404040) bold {1007566943}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 76 LEM-SDL2::Y: 0 STRING: "Fundamental "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#85b8ff #404040) bold {1007566993}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (update-display sdl2) -
  lem-if:update-display
<DEBUG> [17:15:50] lem-sdl2 main.lisp (will-update-display sdl2) -
  will-update-display
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:50] lem-sdl2 main.lisp (display-height sdl2) -
  lem-if:display-height
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (clear-eob sdl2) -
  lem-if:clear-eob LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 1 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0
  STRING: "                                                                                                    "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0 STRING: "  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 2 LEM-SDL2::Y: 0 STRING: "   "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 5 LEM-SDL2::Y: 0 STRING: "*tmp*"
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (orange #404040) bold {1007566D83}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 93 LEM-SDL2::Y: 0 STRING: "  All  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (black #A0A0A0) bold {1007566DD3}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: " 1:0 "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FAFAFA #202020) bold {1007566E23}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: ""
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FFFFFF #404040) bold {1007566E73}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 76 LEM-SDL2::Y: 0 STRING: "Fundamental "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#85b8ff #404040) bold {1007566EC3}>
  
<DEBUG> [17:15:50] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:50] lem-sdl2 main.lisp (update-display sdl2) -
  lem-if:update-display
<DEBUG> [17:15:51] lem-sdl2 main.lisp (will-update-display sdl2) -
  will-update-display
<DEBUG> [17:15:51] lem-sdl2 main.lisp (display-width sdl2) -
  lem-if:display-width
<DEBUG> [17:15:51] lem-sdl2 main.lisp (display-height sdl2) -
  lem-if:display-height
<DEBUG> [17:15:51] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:51] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {1006BEE7D3}> 
<DEBUG> [17:15:51] lem-sdl2 main.lisp (redraw-view-before sdl2) -
  lem-if:redraw-view-before LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:51] lem-sdl2 main.lisp (clear-eob sdl2) -
  lem-if:clear-eob LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 1 
<DEBUG> [17:15:51] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0
  STRING: "                                                                                                    "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:51] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 0 LEM-SDL2::Y: 0 STRING: "  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:51] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 2 LEM-SDL2::Y: 0 STRING: "   "
  LEM-SDL2::ATTRIBUTE-OR-NAME: LEM-CORE:MODELINE 
<DEBUG> [17:15:51] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 5 LEM-SDL2::Y: 0 STRING: "*tmp*"
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (orange #404040) bold {10075675D3}>
  
<DEBUG> [17:15:51] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 93 LEM-SDL2::Y: 0 STRING: "  All  "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (black #A0A0A0) bold {1007567623}>
  
<DEBUG> [17:15:51] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: " 1:0 "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FAFAFA #202020) bold {1007567673}>
  
<DEBUG> [17:15:51] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 88 LEM-SDL2::Y: 0 STRING: ""
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#FFFFFF #404040) bold {10075676C3}>
  
<DEBUG> [17:15:51] lem-sdl2 main.lisp (print-modeline sdl2) -
  lem-if:print-modeline LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}>
  LEM-SDL2::X: 76 LEM-SDL2::Y: 0 STRING: "Fundamental "
  LEM-SDL2::ATTRIBUTE-OR-NAME: #<LEM-CORE:ATTRIBUTE (#85b8ff #404040) bold {1007567713}>
  
<DEBUG> [17:15:51] lem-sdl2 main.lisp (redraw-view-after sdl2) -
  lem-if:redraw-view-after LEM-SDL2::VIEW: #<LEM-SDL2::VIEW {10019805B3}> 
<DEBUG> [17:15:51] lem-sdl2 main.lisp (update-display sdl2) -
  lem-if:update-display

timmydo avatar Jul 16 '23 00:07 timmydo

@timmydo Thanks! Hmmm... is what happens in your machine like this?:

After launching SDL2 Lem, the log <DEBUG> [17:15:51] lem-sdl2 main.lisp (update-display sdl2) - lem-if:update-display printed in the file, but any window appears and any conditions are signaled.

lem-if:update-display is here, yeah it held a lock. lem-if:redraw-view-after (here) also held a same lock. I think it may be a deadlock too.

t-sin avatar Jul 16 '23 16:07 t-sin

I got another chance to look at this. Putting this seemed to get the editor to pop up:

diff --git a/frontends/sdl2/main.lisp b/frontends/sdl2/main.lisp
index 39b30012..398116fe 100644
--- a/frontends/sdl2/main.lisp
+++ b/frontends/sdl2/main.lisp
@@ -846,6 +850,7 @@
                    (adapt-high-dpi-font-size)
                    (sdl2:start-text-input)
                    (funcall function)
+                  (sleep 1)
                    (event-loop))))))

However, I'm not able to interact with the window after it pops up with the tmp fundamental buffer. I'm able to quit with C-x C-c but I'm not able to type anything. If I restart after C-x C-c, I can see the text I typed in the previous session. It's as if the window is not being repainted.

timmydo avatar Aug 09 '23 04:08 timmydo

Ok got another chance to play with this. I'm able to get sdl2 on my Linux machine working with these two changes:

diff --git a/frontends/sdl2/main.lisp b/frontends/sdl2/main.lisp
index 39b30012..27a5510c 100644
--- a/frontends/sdl2/main.lisp
+++ b/frontends/sdl2/main.lisp
@@ -868,7 +868,7 @@
                               (sdl2:push-quit-event)))))
              (declare (ignore editor-thread))
              nil)))
-    (if (sbcl-on-darwin-p)
+    (if t;(sbcl-on-darwin-p)
         (progn
           ;; called *before* any sdl windows are created
           (sdl2:set-hint :video-mac-fullscreen-spaces
diff --git a/src/interp.lisp b/src/interp.lisp
index dbbd1634..fbcccc49 100644
--- a/src/interp.lisp
+++ b/src/interp.lisp
@@ -87,7 +87,7 @@
            (stop-record-key) ; TODO: define handler
            ))
 
-    (redraw)
+    (sdl2:in-main-thread () (redraw))
 
     (handler-case
         (handler-bind ((editor-abort

On shutdown it kills sbcl but I think that's probably because of the existing _exit call.

The second change is obviously a big hack because there isn't supposed to be implementation specific display code in this file. It was just an experiment to validate the SDL2 issues I was having on my machine.

Lem doesn't seem to have a concept of running the main command loop's display operations on the display thread. There are locks on the display mutex but these operations will run on another thread. Perhaps other display backends are more lenient with multithreaded access? I don't know SDL2 internals well enough to know why this doesn't work but it does seem widely mentioned that SDL2 APIs are designed around a single thread. Creating something like lem-if:run-on-display-thread would require propagating the display implementation object down the toplevel-command-loop stack and I'd like to get some feedback before creating a PR with code like that.

Could someone with more knowledge of lem comment on this? Thanks!

@cxxxr

timmydo avatar Aug 20 '23 18:08 timmydo

Oh, I see. It is indeed a problem that the drawing process is not done in the main thread. However, if the entire redraw function is executed in a separate thread from the editor thread, there is a problem that the operator for the non-thread-safe buffer is called in two threads in parallel. So we may need a mechanism to make it run in the main thread in the body of the lem-if:redraw-* method

cxxxr avatar Aug 20 '23 23:08 cxxxr