@ -51,6 +51,7 @@
# include "shared/os-compatibility.h"
# include "shared/cairo-util.h"
# include "fullscreen-shell-unstable-v1-client-protocol.h"
# include "xdg-shell-unstable-v6-client-protocol.h"
# include "presentation-time-server-protocol.h"
# include "linux-dmabuf.h"
# include "windowed-output-api.h"
@ -66,6 +67,7 @@ struct wayland_backend {
struct wl_registry * registry ;
struct wl_compositor * compositor ;
struct wl_shell * shell ;
struct zxdg_shell_v6 * xdg_shell ;
struct zwp_fullscreen_shell_v1 * fshell ;
struct wl_shm * shm ;
@ -98,7 +100,10 @@ struct wayland_output {
uint32_t global_id ;
struct wl_shell_surface * shell_surface ;
struct zxdg_surface_v6 * xdg_surface ;
struct zxdg_toplevel_v6 * xdg_toplevel ;
int configure_width , configure_height ;
bool wait_for_configure ;
} parent ;
int keyboard_count ;
@ -623,6 +628,12 @@ wayland_output_repaint_pixman(struct weston_output *output_base,
static void
wayland_backend_destroy_output_surface ( struct wayland_output * output )
{
if ( output - > parent . xdg_toplevel )
zxdg_toplevel_v6_destroy ( output - > parent . xdg_toplevel ) ;
if ( output - > parent . xdg_surface )
zxdg_surface_v6_destroy ( output - > parent . xdg_surface ) ;
if ( output - > parent . shell_surface )
wl_shell_surface_destroy ( output - > parent . shell_surface ) ;
@ -822,6 +833,9 @@ wayland_output_set_windowed(struct wayland_output *output)
title = strdup ( WINDOW_TITLE ) ;
}
if ( output - > parent . xdg_toplevel )
zxdg_toplevel_v6_set_title ( output - > parent . xdg_toplevel , title ) ;
if ( ! b - > theme ) {
b - > theme = theme_create ( ) ;
if ( ! b - > theme ) {
@ -840,7 +854,8 @@ wayland_output_set_windowed(struct wayland_output *output)
wayland_output_resize_surface ( output ) ;
wl_shell_surface_set_toplevel ( output - > parent . shell_surface ) ;
if ( output - > parent . shell_surface )
wl_shell_surface_set_toplevel ( output - > parent . shell_surface ) ;
return 0 ;
}
@ -860,7 +875,9 @@ wayland_output_set_fullscreen(struct wayland_output *output,
wayland_output_resize_surface ( output ) ;
if ( output - > parent . shell_surface ) {
if ( output - > parent . xdg_toplevel ) {
zxdg_toplevel_v6_set_fullscreen ( output - > parent . xdg_toplevel , target ) ;
} else if ( output - > parent . shell_surface ) {
wl_shell_surface_set_fullscreen ( output - > parent . shell_surface ,
method , framerate , target ) ;
} else if ( b - > parent . fshell ) {
@ -961,7 +978,7 @@ wayland_output_switch_mode(struct weston_output *output_base,
b = to_wayland_backend ( output_base - > compositor ) ;
if ( output - > parent . shell_surface | | ! b - > parent . fshell )
if ( output - > parent . xdg_surface | | output - > parent . shell_surface | | ! b - > parent . fshell )
return - 1 ;
mode = wayland_output_choose_mode ( output , mode ) ;
@ -1033,6 +1050,41 @@ err_output:
return - 1 ;
}
static void
handle_xdg_surface_configure ( void * data , struct zxdg_surface_v6 * surface ,
uint32_t serial )
{
zxdg_surface_v6_ack_configure ( surface , serial ) ;
}
static const struct zxdg_surface_v6_listener xdg_surface_listener = {
handle_xdg_surface_configure
} ;
static void
handle_xdg_toplevel_configure ( void * data , struct zxdg_toplevel_v6 * toplevel ,
int32_t width , int32_t height ,
struct wl_array * states )
{
struct wayland_output * output = data ;
output - > parent . configure_width = width ;
output - > parent . configure_height = height ;
output - > parent . wait_for_configure = false ;
/* FIXME: implement resizing */
}
static void
handle_xdg_toplevel_close ( void * data , struct zxdg_toplevel_v6 * xdg_toplevel )
{
}
static const struct zxdg_toplevel_v6_listener xdg_toplevel_listener = {
handle_xdg_toplevel_configure ,
handle_xdg_toplevel_close ,
} ;
static int
wayland_backend_create_output_surface ( struct wayland_output * output )
{
@ -1047,7 +1099,28 @@ wayland_backend_create_output_surface(struct wayland_output *output)
output - > parent . draw_initial_frame = true ;
if ( b - > parent . shell ) {
if ( b - > parent . xdg_shell ) {
output - > parent . xdg_surface =
zxdg_shell_v6_get_xdg_surface ( b - > parent . xdg_shell ,
output - > parent . surface ) ;
zxdg_surface_v6_add_listener ( output - > parent . xdg_surface ,
& xdg_surface_listener , output ) ;
output - > parent . xdg_toplevel =
zxdg_surface_v6_get_toplevel ( output - > parent . xdg_surface ) ;
zxdg_toplevel_v6_add_listener ( output - > parent . xdg_toplevel ,
& xdg_toplevel_listener , output ) ;
wl_surface_commit ( output - > parent . surface ) ;
output - > parent . wait_for_configure = true ;
while ( output - > parent . wait_for_configure )
wl_display_dispatch ( b - > parent . wl_display ) ;
weston_log ( " wayland-backend: Using xdg_shell_v6 \n " ) ;
}
else if ( b - > parent . shell ) {
output - > parent . shell_surface =
wl_shell_get_shell_surface ( b - > parent . shell ,
output - > parent . surface ) ;
@ -1058,6 +1131,8 @@ wayland_backend_create_output_surface(struct wayland_output *output)
wl_shell_surface_add_listener ( output - > parent . shell_surface ,
& shell_surface_listener , output ) ;
weston_log ( " wayland-backend: Using wl_shell \n " ) ;
}
return 0 ;
@ -1107,7 +1182,11 @@ wayland_output_enable(struct weston_output *base)
WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER ,
output - > mode . refresh , output - > parent . output ) ;
if ( output - > parent . shell_surface ) {
if ( output - > parent . xdg_toplevel ) {
zxdg_toplevel_v6_set_fullscreen ( output - > parent . xdg_toplevel ,
output - > parent . output ) ;
}
else if ( output - > parent . shell_surface ) {
wl_shell_surface_set_fullscreen ( output - > parent . shell_surface ,
WL_SHELL_SURFACE_FULLSCREEN_METHOD_DRIVER ,
output - > mode . refresh , output - > parent . output ) ;
@ -1285,9 +1364,14 @@ wayland_output_create_fullscreen(struct wayland_backend *b)
goto err_surface ;
/* What should size be set if conditional is false? */
if ( b - > parent . shell ) {
wl_shell_surface_set_fullscreen ( output - > parent . shell_surface ,
0 , 0 , NULL ) ;
if ( b - > parent . xdg_shell | | b - > parent . shell ) {
if ( output - > parent . xdg_toplevel )
zxdg_toplevel_v6_set_fullscreen ( output - > parent . xdg_toplevel ,
output - > parent . output ) ;
else if ( output - > parent . shell_surface )
wl_shell_surface_set_fullscreen ( output - > parent . shell_surface ,
0 , 0 , NULL ) ;
wl_display_roundtrip ( b - > parent . wl_display ) ;
width = output - > parent . configure_width ;
@ -1504,9 +1588,12 @@ input_handle_button(void *data, struct wl_pointer *pointer,
button , state ) ;
if ( frame_status ( input - > output - > frame ) & FRAME_STATUS_MOVE ) {
wl_shell_surface _move( input - > output - > parent . shell_surface ,
if ( input - > output - > parent . xdg_toplevel )
zxdg_toplevel_v6 _move ( input - > output - > parent . xdg_toplevel ,
input - > parent . seat , serial ) ;
else if ( input - > output - > parent . shell_surface )
wl_shell_surface_move ( input - > output - > parent . shell_surface ,
input - > parent . seat , serial ) ;
frame_status_clear ( input - > output - > frame ,
FRAME_STATUS_MOVE ) ;
return ;
@ -1835,8 +1922,12 @@ input_handle_touch_down(void *data, struct wl_touch *wl_touch,
if ( first_touch & & ( frame_status ( output - > frame ) & FRAME_STATUS_MOVE ) ) {
input - > touch_points - - ;
wl_shell_surface_move ( output - > parent . shell_surface ,
input - > parent . seat , serial ) ;
if ( output - > parent . xdg_toplevel )
zxdg_toplevel_v6_move ( output - > parent . xdg_toplevel ,
input - > parent . seat , serial ) ;
else if ( output - > parent . shell_surface )
wl_shell_surface_move ( output - > parent . shell_surface ,
input - > parent . seat , serial ) ;
frame_status_clear ( output - > frame ,
FRAME_STATUS_MOVE ) ;
return ;
@ -2163,6 +2254,16 @@ wayland_parent_output_destroy(struct wayland_parent_output *output)
}
}
static void
xdg_shell_ping ( void * data , struct zxdg_shell_v6 * shell , uint32_t serial )
{
zxdg_shell_v6_pong ( shell , serial ) ;
}
static const struct zxdg_shell_v6_listener xdg_shell_listener = {
xdg_shell_ping ,
} ;
static void
registry_handle_global ( void * data , struct wl_registry * registry , uint32_t name ,
const char * interface , uint32_t version )
@ -2173,6 +2274,12 @@ registry_handle_global(void *data, struct wl_registry *registry, uint32_t name,
b - > parent . compositor =
wl_registry_bind ( registry , name ,
& wl_compositor_interface , 1 ) ;
} else if ( strcmp ( interface , " zxdg_shell_v6 " ) = = 0 ) {
b - > parent . xdg_shell =
wl_registry_bind ( registry , name ,
& zxdg_shell_v6_interface , 1 ) ;
zxdg_shell_v6_add_listener ( b - > parent . xdg_shell ,
& xdg_shell_listener , b ) ;
} else if ( strcmp ( interface , " wl_shell " ) = = 0 ) {
b - > parent . shell =
wl_registry_bind ( registry , name ,
@ -2249,6 +2356,12 @@ wayland_destroy(struct weston_compositor *ec)
if ( b - > parent . shm )
wl_shm_destroy ( b - > parent . shm ) ;
if ( b - > parent . xdg_shell )
zxdg_shell_v6_destroy ( b - > parent . xdg_shell ) ;
if ( b - > parent . shell )
wl_shell_destroy ( b - > parent . shell ) ;
if ( b - > parent . fshell )
zwp_fullscreen_shell_v1_release ( b - > parent . fshell ) ;