@ -641,6 +641,20 @@ weston_wm_window_get_child_position(struct weston_wm_window *window,
}
}
}
}
static void
weston_wm_window_get_input_rect ( struct weston_wm_window * window ,
int32_t * x , int32_t * y ,
int32_t * width , int32_t * height )
{
if ( ! window - > decorate ) {
weston_wm_window_get_child_position ( window , x , y ) ;
* width = window - > width ;
* height = window - > height ;
} else {
frame_input_rect ( window - > frame , x , y , width , height ) ;
}
}
static void
static void
weston_wm_window_send_configure_notify ( struct weston_wm_window * window )
weston_wm_window_send_configure_notify ( struct weston_wm_window * window )
{
{
@ -966,6 +980,7 @@ weston_wm_window_create_frame(struct weston_wm_window *window)
{
{
struct weston_wm * wm = window - > wm ;
struct weston_wm * wm = window - > wm ;
uint32_t values [ 3 ] ;
uint32_t values [ 3 ] ;
xcb_rectangle_t rect ;
int x , y , width , height ;
int x , y , width , height ;
int buttons = FRAME_BUTTON_CLOSE ;
int buttons = FRAME_BUTTON_CLOSE ;
@ -1020,6 +1035,25 @@ weston_wm_window_create_frame(struct weston_wm_window *window)
& wm - > format_rgba ,
& wm - > format_rgba ,
width , height ) ;
width , height ) ;
weston_wm_window_get_input_rect ( window , & x , & y , & width , & height ) ;
rect . x = x ;
rect . y = y ;
rect . width = width ;
rect . height = height ;
/* The window frame was created with position and size which include
* an offset for margins and shadow . Set the input region to ignore
* shadow . */
xcb_shape_rectangles ( wm - > conn ,
XCB_SHAPE_SO_SET ,
XCB_SHAPE_SK_INPUT ,
0 ,
window - > frame_id ,
0 ,
0 ,
1 ,
& rect ) ;
hash_table_insert ( wm - > window_hash , window - > frame_id , window ) ;
hash_table_insert ( wm - > window_hash , window - > frame_id , window ) ;
}
}