diff --git a/WINGs/wclient_wl.c b/WINGs/wclient_wl.c index 37a0424..b790439 100644 --- a/WINGs/wclient_wl.c +++ b/WINGs/wclient_wl.c @@ -645,6 +645,15 @@ wl_client_toplevel_remap(WNativeWindow id) wl_client_toplevel_remap_locked(top); } +void +wl_client_scene_node_set_enabled(unsigned long id, int enabled) +{ + if (enabled) + wl_client_toplevel_remap((WNativeWindow)id); + else + wl_client_toplevel_recycle((WNativeWindow)id); +} + void W_WLClientSetMinMaxSize(W_View *view) { @@ -1388,6 +1397,17 @@ W_WLClientInit(struct W_Screen *scrPtr, const char *display) W_WLClientToplevelRealizeFn = wl_client_toplevel_realize; W_WLClientToplevelResizeFn = wl_client_toplevel_resize; W_WLClientToplevelDestroyFn = wl_client_toplevel_destroy; + /* Wire up scene-node enable/disable for client toplevels. + * When running as a client (e.g. WPrefs), the compositor-side + * function pointer is not available, so we use recycle/remap + * to destroy/recreate the wl_surface instead. */ + extern void (*W_ViewSceneNodeSetEnabledFn)(unsigned long id, int enabled); + if (!W_ViewSceneNodeSetEnabledFn) { + extern void wl_client_toplevel_recycle(WNativeWindow); + extern void wl_client_toplevel_remap(WNativeWindow); + W_ViewSceneNodeSetEnabledFn = + wl_client_scene_node_set_enabled; + } { extern void (*W_ViewCommitBackingFn)(unsigned long id); extern void (*W_ViewDestroyBackingFn)(unsigned long id);