@ -138,8 +138,6 @@ struct weston_wm_window {
xcb_window_t frame_id ;
struct frame * frame ;
cairo_surface_t * cairo_surface ;
int icon ;
cairo_surface_t * icon_surface ; /* A temporary slot, to be passed to frame on creation */
uint32_t surface_id ;
struct weston_surface * surface ;
struct weston_desktop_xwayland_surface * shsurf ;
@ -475,7 +473,6 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
{ wm - > atom . net_wm_state , TYPE_NET_WM_STATE , NULL } ,
{ wm - > atom . net_wm_window_type , XCB_ATOM_ATOM , F ( type ) } ,
{ wm - > atom . net_wm_name , XCB_ATOM_STRING , F ( name ) } ,
{ wm - > atom . net_wm_icon , XCB_ATOM_CARDINAL , F ( icon ) } ,
{ wm - > atom . net_wm_pid , XCB_ATOM_CARDINAL , F ( pid ) } ,
{ wm - > atom . motif_wm_hints , TYPE_MOTIF_WM_HINTS , NULL } ,
{ wm - > atom . wm_client_machine , XCB_ATOM_WM_CLIENT_MACHINE , F ( machine ) } ,
@ -976,10 +973,8 @@ weston_wm_window_create_frame(struct weston_wm_window *window)
buttons | = FRAME_BUTTON_MAXIMIZE ;
window - > frame = frame_create ( window - > wm - > theme ,
window - > width , window - > height ,
buttons , window - > name ,
window - > icon_surface ) ;
window - > icon_surface = NULL ;
window - > width , window - > height ,
buttons , window - > name , NULL ) ;
frame_resize_inside ( window - > frame , window - > width , window - > height ) ;
weston_wm_window_get_frame_size ( window , & width , & height ) ;
@ -1318,70 +1313,6 @@ weston_wm_window_schedule_repaint(struct weston_wm_window *window)
weston_wm_window_do_repaint , window ) ;
}
static void
handle_icon_surface_destroy ( void * data )
{
free ( data ) ;
}
static void
weston_wm_handle_icon ( struct weston_wm * wm , struct weston_wm_window * window )
{
xcb_get_property_reply_t * reply ;
xcb_get_property_cookie_t cookie ;
uint32_t length ;
uint32_t * data , width , height ;
cairo_surface_t * new_surface ;
/* TODO: icons don’t have any specified order, we should pick the
* closest one to the target dimension instead of the first one . */
cookie = xcb_get_property ( wm - > conn , 0 , window - > id ,
wm - > atom . net_wm_icon , XCB_ATOM_ANY , 0 ,
UINT32_MAX ) ;
reply = xcb_get_property_reply ( wm - > conn , cookie , NULL ) ;
length = xcb_get_property_value_length ( reply ) ;
/* This is in 32-bit words, not in bytes. */
if ( length < 2 ) {
free ( reply ) ;
return ;
}
data = xcb_get_property_value ( reply ) ;
width = * data + + ;
height = * data + + ;
/* Some checks against malformed input. */
if ( width = = 0 | | height = = 0 | | length < 2 + width * height ) {
free ( reply ) ;
return ;
}
new_surface =
cairo_image_surface_create_for_data ( ( unsigned char * ) data ,
CAIRO_FORMAT_ARGB32 ,
width , height , width * 4 ) ;
/* Bail out in case anything wrong happened during surface creation. */
if ( cairo_surface_status ( new_surface ) ! = CAIRO_STATUS_SUCCESS ) {
cairo_surface_destroy ( new_surface ) ;
free ( reply ) ;
return ;
}
if ( window - > icon_surface )
cairo_surface_destroy ( window - > icon_surface ) ;
cairo_surface_set_user_data ( new_surface , NULL , reply ,
& handle_icon_surface_destroy ) ;
if ( window - > frame )
frame_set_icon ( window - > frame , new_surface ) ;
else /* We don’t have a frame yet */
window - > icon_surface = new_surface ;
}
static void
weston_wm_handle_property_notify ( struct weston_wm * wm , xcb_generic_event_t * event )
{
@ -1402,19 +1333,6 @@ weston_wm_handle_property_notify(struct weston_wm *wm, xcb_generic_event_t *even
read_and_dump_property ( wm , property_notify - > window ,
property_notify - > atom ) ;
if ( property_notify - > atom = = wm - > atom . net_wm_icon ) {
if ( property_notify - > state ! = XCB_PROPERTY_DELETE ) {
weston_wm_handle_icon ( wm , window ) ;
} else {
if ( window - > frame )
frame_set_icon ( window - > frame , NULL ) ;
if ( window - > icon_surface )
cairo_surface_destroy ( window - > icon_surface ) ;
window - > icon_surface = NULL ;
}
weston_wm_window_schedule_repaint ( window ) ;
}
if ( property_notify - > atom = = wm - > atom . net_wm_name | |
property_notify - > atom = = XCB_ATOM_WM_NAME )
weston_wm_window_schedule_repaint ( window ) ;
@ -1475,8 +1393,6 @@ weston_wm_window_destroy(struct weston_wm_window *window)
wl_event_source_remove ( window - > repaint_source ) ;
if ( window - > cairo_surface )
cairo_surface_destroy ( window - > cairo_surface ) ;
if ( window - > icon_surface )
cairo_surface_destroy ( window - > icon_surface ) ;
if ( window - > frame_id ) {
xcb_reparent_window ( wm - > conn , window - > id , wm - > wm_window , 0 , 0 ) ;