MakieOrg / Makie.jl

Interactive data visualizations and plotting in Julia
https://docs.makie.org/stable
MIT License
2.38k stars 302 forks source link

Displaying a subscene in a GLMakie.Screen resizes the parent scene #2710

Open asinghvi17 opened 1 year ago

asinghvi17 commented 1 year ago

Consider the following MWE.

using Makie, GLMakie
top_sc = Scene(resolution = (1000, 1000));
sub_sc = Scene(top_sc; px_area = Rect2{Int}(100, 100, 450, 450));

top_sc.px_area[] # 0,0,1000,1000

GLMakie.Screen(sub_sc)

top_sc.px_area # 0, 0, 450, 450

This is an issue for any combination of displaying (removing the semicolon) for top_sc and sub_sc. It only happens in GLMakie; CairoMakie and WGLMakie don't suffer from this issue.

asinghvi17 commented 1 year ago

I set a function to error when top_sc.px_area changed. Here's the stacktrace.

Are Scene events shared between all scenes in a tree? That might explain why this is happening.

julia> old_pxarea = top_sc.px_area[]
HyperRectangle{2, Int64}([0, 0], [1000, 1000])

julia> on(top_sc.px_area) do pxarea
           if pxarea.widths != old_pxarea.widths
               error("Changed here")
           end
       end
ObserverFunction defined at REPL[723]:2 operating on Observable(HyperRectangle{2, Int64}([0, 0], [1000, 1000]))

julia> GLMakie.Screen(sub_sc)
ERROR: Changed here
Stacktrace:
  [1] error(s::String)
    @ Base ./error.jl:35
  [2] (::var"#82#83")(pxarea::GeometryBasics.HyperRectangle{2, Int64})
    @ Main ./REPL[723]:3
  [3] #invokelatest#2
    @ ./essentials.jl:729 [inlined]
  [4] invokelatest
    @ ./essentials.jl:726 [inlined]
  [5] notify
    @ ~/.julia/packages/Observables/PHGQ8/src/Observables.jl:169 [inlined]
  [6] setindex!(observable::Observable, val::Any)
    @ Observables ~/.julia/packages/Observables/PHGQ8/src/Observables.jl:86
  [7] (::Makie.var"#103#105")(w_area::GeometryBasics.HyperRectangle{2, Int64})
    @ Makie ~/Documents/Business/India/XKDR/dev/Makie.jl/src/scenes.jl:214
  [8] #invokelatest#2
    @ ./essentials.jl:729 [inlined]
  [9] invokelatest
    @ ./essentials.jl:726 [inlined]
 [10] notify
    @ ~/.julia/packages/Observables/PHGQ8/src/Observables.jl:169 [inlined]
 [11] setindex!(observable::Observable, val::Any)
    @ Observables ~/.julia/packages/Observables/PHGQ8/src/Observables.jl:86
 [12] (::GLMakie.var"#windowsizecb#144"{Scene, GLMakie.Screen{GLFW.Window}})(window::GLFW.Window, width::Int32, height::Int32)
    @ GLMakie ~/Documents/Business/India/XKDR/dev/Makie.jl/GLMakie/src/events.jl:55
 [13] window_area(scene::Scene, screen::GLMakie.Screen{GLFW.Window})
    @ GLMakie ~/Documents/Business/India/XKDR/dev/Makie.jl/GLMakie/src/events.jl:75
 [14] connect_screen(scene::Scene, screen::GLMakie.Screen{GLFW.Window})
    @ Makie ~/Documents/Business/India/XKDR/dev/Makie.jl/src/interaction/events.jl:20
 [15] display_scene!(screen::GLMakie.Screen{GLFW.Window}, scene::Scene)
    @ GLMakie ~/Documents/Business/India/XKDR/dev/Makie.jl/GLMakie/src/screen.jl:391
 [16] GLMakie.Screen(scene::Scene, config::GLMakie.ScreenConfig; visible::Nothing, start_renderloop::Bool)
    @ GLMakie ~/Documents/Business/India/XKDR/dev/Makie.jl/GLMakie/src/screen.jl:406
 [17] #Screen#42
    @ ~/Documents/Business/India/XKDR/dev/Makie.jl/GLMakie/src/screen.jl:398 [inlined]
 [18] GLMakie.Screen(scene::Scene)
    @ GLMakie ~/Documents/Business/India/XKDR/dev/Makie.jl/GLMakie/src/screen.jl:396
 [19] top-level scope
    @ REPL[724]:1

https://github.com/MakieOrg/Makie.jl/blob/4f50a95090c4ab4ec45772933bbcd32c680d3854/GLMakie/src/events.jl#L55-L56

ffreyer commented 3 weeks ago

I think what's happening here is: