@ -22,15 +22,14 @@ static void output_handle_resource_destroy(struct wl_resource *resource) {
wl_list_remove ( wl_resource_get_link ( resource ) ) ;
wl_list_remove ( wl_resource_get_link ( resource ) ) ;
}
}
static void output_send_details ( struct wl_resource * resource ,
static void output_send_details ( struct wlr_xdg_output * xdg_output ,
struct wlr_output_layout_output * layout_output ) {
struct wl_resource * resource ) {
struct wlr_output * output = layout_output - > output ;
struct wlr_output * output = xdg_output - > layout_output - > output ;
zxdg_output_v1_send_logical_position ( resource ,
layout_output - > x , layout_output - > y ) ;
int width , height ;
zxdg_output_v1_send_logical_position ( resource ,
wlr_output_effective_resolution ( layout_output - > output , & width , & height ) ;
xdg_output - > x , xdg_output - > y ) ;
zxdg_output_v1_send_logical_size ( resource , width , height ) ;
zxdg_output_v1_send_logical_size ( resource ,
xdg_output - > width , xdg_output - > height ) ;
uint32_t version = wl_resource_get_version ( resource ) ;
uint32_t version = wl_resource_get_version ( resource ) ;
if ( version > = ZXDG_OUTPUT_V1_NAME_SINCE_VERSION ) {
if ( version > = ZXDG_OUTPUT_V1_NAME_SINCE_VERSION ) {
@ -46,6 +45,32 @@ static void output_send_details(struct wl_resource *resource,
zxdg_output_v1_send_done ( resource ) ;
zxdg_output_v1_send_done ( resource ) ;
}
}
static void output_update ( struct wlr_xdg_output * xdg_output ) {
struct wlr_output_layout_output * layout_output = xdg_output - > layout_output ;
bool updated = false ;
if ( layout_output - > x ! = xdg_output - > x | | layout_output - > y ! = xdg_output - > y ) {
xdg_output - > x = layout_output - > x ;
xdg_output - > y = layout_output - > y ;
updated = true ;
}
int width , height ;
wlr_output_effective_resolution ( layout_output - > output , & width , & height ) ;
if ( xdg_output - > width ! = width | | xdg_output - > height ! = height ) {
xdg_output - > width = width ;
xdg_output - > height = height ;
updated = true ;
}
if ( updated ) {
struct wl_resource * resource ;
wl_resource_for_each ( resource , & xdg_output - > resources ) {
output_send_details ( xdg_output , resource ) ;
}
}
}
static void output_destroy ( struct wlr_xdg_output * output ) {
static void output_destroy ( struct wlr_xdg_output * output ) {
struct wl_resource * resource , * tmp ;
struct wl_resource * resource , * tmp ;
wl_resource_for_each_safe ( resource , tmp , & output - > resources ) {
wl_resource_for_each_safe ( resource , tmp , & output - > resources ) {
@ -98,9 +123,11 @@ static void output_manager_handle_get_xdg_output(struct wl_client *client,
}
}
wl_resource_set_implementation ( xdg_output_resource , & output_implementation ,
wl_resource_set_implementation ( xdg_output_resource , & output_implementation ,
NULL , output_handle_resource_destroy ) ;
NULL , output_handle_resource_destroy ) ;
output_send_details ( xdg_output_resource , layout_output ) ;
wl_list_insert ( & xdg_output - > resources ,
wl_list_insert ( & xdg_output - > resources ,
wl_resource_get_link ( xdg_output_resource ) ) ;
wl_resource_get_link ( xdg_output_resource ) ) ;
output_send_details ( xdg_output , xdg_output_resource ) ;
}
}
static const struct zxdg_output_manager_v1_interface
static const struct zxdg_output_manager_v1_interface
@ -146,16 +173,14 @@ static void add_output(struct wlr_xdg_output_manager *manager,
output - > destroy . notify = handle_output_destroy ;
output - > destroy . notify = handle_output_destroy ;
wl_signal_add ( & layout_output - > events . destroy , & output - > destroy ) ;
wl_signal_add ( & layout_output - > events . destroy , & output - > destroy ) ;
wl_list_insert ( & manager - > outputs , & output - > link ) ;
wl_list_insert ( & manager - > outputs , & output - > link ) ;
output_update ( output ) ;
}
}
static void output_manager_send_details (
static void output_manager_send_details (
struct wlr_xdg_output_manager * manager ) {
struct wlr_xdg_output_manager * manager ) {
struct wlr_xdg_output * output ;
struct wlr_xdg_output * output ;
wl_list_for_each ( output , & manager - > outputs , link ) {
wl_list_for_each ( output , & manager - > outputs , link ) {
struct wl_resource * resource ;
output_update ( output ) ;
wl_resource_for_each ( resource , & output - > resources ) {
output_send_details ( resource , output - > layout_output ) ;
}
}
}
}
}