@@ -66,6 +66,11 @@ Wayland::Wayland()
6666#endif
6767 , m_pending_frame(0 )
6868 , m_shm_pool(NULL )
69+ #if defined(WAYLAND_LINUX_XDG_SHELL_SUPPORT)
70+ , m_xdg_wm_base(NULL )
71+ , m_xdg_surface(NULL )
72+ , m_xdg_toplevel(NULL )
73+ #endif
6974 , m_display_fd(-1 )
7075 , m_fd(-1 )
7176 , m_bufmgr(NULL )
@@ -112,6 +117,18 @@ int Wayland::DisplayRoundtrip()
112117
113118bool Wayland::CreateSurface ()
114119{
120+ #if defined(WAYLAND_LINUX_XDG_SHELL_SUPPORT)
121+ static struct xdg_surface_listener
122+ xdg_surface_listener = {
123+ xdg_surface_configure
124+ };
125+
126+ static struct xdg_toplevel_listener
127+ xdg_toplevel_listener = {
128+ xdg_toplevel_configure,
129+ xdg_toplevel_close
130+ };
131+ #endif
115132 static const struct wl_shell_surface_listener
116133 shell_surface_listener = {
117134 shell_surface_ping,
@@ -122,20 +139,45 @@ bool Wayland::CreateSurface()
122139 if (NULL == m_surface)
123140 return false ;
124141
125- m_shell_surface = wl_shell_get_shell_surface (m_shell
126- , m_surface);
127- if (NULL == m_shell_surface)
128- {
129- wl_surface_destroy (m_surface);
130- return false ;
142+ #if defined(WAYLAND_LINUX_XDG_SHELL_SUPPORT)
143+ if (m_xdg_wm_base) {
144+ m_xdg_surface = xdg_wm_base_get_xdg_surface (m_xdg_wm_base
145+ , m_surface);
146+ if (nullptr == m_xdg_surface) {
147+ xdg_surface_destroy (m_xdg_surface);
148+ return false ;
149+ }
150+
151+ xdg_surface_add_listener (m_xdg_surface
152+ , &xdg_surface_listener
153+ , 0 );
154+ m_xdg_toplevel = xdg_surface_get_toplevel (m_xdg_surface);
155+ if (nullptr == m_xdg_toplevel)
156+ return false ;
157+
158+ xdg_toplevel_add_listener (m_xdg_toplevel
159+ , &xdg_toplevel_listener
160+ , 0 );
161+ wl_surface_commit (m_surface);
162+ wl_display_dispatch (m_display);
131163 }
164+ else if (m_shell)
165+ #endif
166+ {
167+ m_shell_surface = wl_shell_get_shell_surface (m_shell
168+ , m_surface);
169+ if (NULL == m_shell_surface) {
170+ wl_surface_destroy (m_surface);
171+ return false ;
172+ }
132173
133- wl_shell_surface_add_listener (m_shell_surface
134- , &shell_surface_listener
135- , 0 );
136- wl_shell_surface_set_toplevel (m_shell_surface);
137- wl_shell_surface_set_user_data (m_shell_surface, m_surface);
138- wl_surface_set_user_data (m_surface, NULL );
174+ wl_shell_surface_add_listener (m_shell_surface
175+ , &shell_surface_listener
176+ , 0 );
177+ wl_shell_surface_set_toplevel (m_shell_surface);
178+ wl_shell_surface_set_user_data (m_shell_surface, m_surface);
179+ wl_surface_set_user_data (m_surface, NULL );
180+ }
139181 return true ;
140182}
141183
@@ -146,6 +188,12 @@ void Wayland::FreeSurface()
146188 wl_shell_surface_destroy (m_shell_surface);
147189 if (NULL != m_surface)
148190 wl_surface_destroy (m_surface);
191+ #if defined(WAYLAND_LINUX_XDG_SHELL_SUPPORT)
192+ if (nullptr != m_xdg_toplevel)
193+ xdg_toplevel_destroy (m_xdg_toplevel);
194+ if (nullptr != m_xdg_surface)
195+ xdg_surface_destroy (m_xdg_surface);
196+ #endif
149197}
150198
151199void Wayland::Sync ()
@@ -436,12 +484,30 @@ void Wayland::RegistryGlobal(struct wl_registry *registry
436484 , name
437485 , &wl_compositor_interface
438486 , version));
439- else if (0 == strcmp (interface, " wl_shell" ))
487+ else if (0 == strcmp (interface, " wl_shell" )) {
440488 m_shell = static_cast <wl_shell*>
441489 (wl_registry_bind (registry
442490 , name
443491 , &wl_shell_interface
444492 , version));
493+ }
494+ #if defined(WAYLAND_LINUX_XDG_SHELL_SUPPORT)
495+ else if (0 == strcmp (interface, " xdg_wm_base" )) {
496+ static const struct xdg_wm_base_listener
497+ xdg_wm_base_listener = {
498+ xdg_wm_base_ping
499+ };
500+ m_xdg_wm_base =
501+ static_cast <xdg_wm_base*>(wl_registry_bind (registry
502+ , name
503+ , &xdg_wm_base_interface
504+ , 1 ));
505+
506+ xdg_wm_base_add_listener (m_xdg_wm_base
507+ , &xdg_wm_base_listener
508+ , this );
509+ }
510+ #endif
445511 else if (0 == strcmp (interface, " wl_drm" )) {
446512 static const struct wl_drm_listener drm_listener = {
447513 drm_handle_device,
0 commit comments