@ -38,6 +38,7 @@ const char *atom_map[ATOM_LAST] = {
[ NET_ACTIVE_WINDOW ] = " _NET_ACTIVE_WINDOW " ,
[ NET_WM_MOVERESIZE ] = " _NET_WM_MOVERESIZE " ,
[ NET_SUPPORTING_WM_CHECK ] = " _NET_SUPPORTING_WM_CHECK " ,
[ NET_WM_STATE_FOCUSED ] = " _NET_WM_STATE_FOCUSED " ,
[ NET_WM_STATE_MODAL ] = " _NET_WM_STATE_MODAL " ,
[ NET_WM_STATE_FULLSCREEN ] = " _NET_WM_STATE_FULLSCREEN " ,
[ NET_WM_STATE_MAXIMIZED_VERT ] = " _NET_WM_STATE_MAXIMIZED_VERT " ,
@ -238,8 +239,20 @@ static void xwm_set_net_client_list(struct wlr_xwm *xwm) {
XCB_ATOM_WINDOW , 32 , mapped_surfaces , windows ) ;
}
static void xwm_send_focus_window ( struct wlr_xwm * xwm ,
static void xsurface_set_net_wm_state ( struct wlr_xwayland_surface * xsurface ) ;
static void xwm_set_focus_window ( struct wlr_xwm * xwm ,
struct wlr_xwayland_surface * xsurface ) {
struct wlr_xwayland_surface * unfocus_surface = xwm - > focus_surface ;
// We handle cases where focus_surface == xsurface because we
// want to be able to deny FocusIn events.
xwm - > focus_surface = xsurface ;
if ( unfocus_surface ) {
xsurface_set_net_wm_state ( unfocus_surface ) ;
}
if ( ! xsurface ) {
xcb_set_input_focus_checked ( xwm - > xcb_conn ,
XCB_INPUT_FOCUS_POINTER_ROOT ,
@ -270,6 +283,8 @@ static void xwm_send_focus_window(struct wlr_xwm *xwm,
values [ 0 ] = XCB_STACK_MODE_ABOVE ;
xcb_configure_window ( xwm - > xcb_conn , xsurface - > window_id ,
XCB_CONFIG_WINDOW_STACK_MODE , values ) ;
xsurface_set_net_wm_state ( xsurface ) ;
}
static void xwm_surface_activate ( struct wlr_xwm * xwm ,
@ -285,9 +300,7 @@ static void xwm_surface_activate(struct wlr_xwm *xwm,
xwm_set_net_active_window ( xwm , XCB_WINDOW_NONE ) ;
}
xwm_send_focus_window ( xwm , xsurface ) ;
xwm - > focus_surface = xsurface ;
xwm_set_focus_window ( xwm , xsurface ) ;
xcb_flush ( xwm - > xcb_conn ) ;
}
@ -295,7 +308,7 @@ static void xwm_surface_activate(struct wlr_xwm *xwm,
static void xsurface_set_net_wm_state ( struct wlr_xwayland_surface * xsurface ) {
struct wlr_xwm * xwm = xsurface - > xwm ;
uint32_t property [ 5 ] ;
uint32_t property [ 6 ] ;
size_t i = 0 ;
if ( xsurface - > modal ) {
property [ i + + ] = xwm - > atoms [ NET_WM_STATE_MODAL ] ;
@ -312,6 +325,9 @@ static void xsurface_set_net_wm_state(struct wlr_xwayland_surface *xsurface) {
if ( xsurface - > minimized ) {
property [ i + + ] = xwm - > atoms [ NET_WM_STATE_HIDDEN ] ;
}
if ( xsurface = = xwm - > focus_surface ) {
property [ i + + ] = xwm - > atoms [ NET_WM_STATE_FOCUSED ] ;
}
assert ( i < = sizeof ( property ) / sizeof ( property [ 0 ] ) ) ;
xcb_change_property ( xwm - > xcb_conn ,
@ -1299,10 +1315,10 @@ static void xwm_handle_focus_in(struct wlr_xwm *xwm,
struct wlr_xwayland_surface * requested_focus = lookup_surface ( xwm , ev - > event ) ;
if ( xwm - > focus_surface & & requested_focus & &
requested_focus - > pid = = xwm - > focus_surface - > pid ) {
xwm - > focus_surface = requested_focus ;
xwm_set_focus_window ( xwm , requested_focus ) ;
} else {
xwm_set_focus_window ( xwm , xwm - > focus_surface ) ;
}
xwm_send_focus_window ( xwm , xwm - > focus_surface ) ;
}
static void xwm_handle_xcb_error ( struct wlr_xwm * xwm , xcb_value_error_t * ev ) {
@ -1817,6 +1833,7 @@ struct wlr_xwm *xwm_create(struct wlr_xwayland *xwayland, int wm_fd) {
xwm - > atoms [ NET_WM_STATE ] ,
xwm - > atoms [ NET_ACTIVE_WINDOW ] ,
xwm - > atoms [ NET_WM_MOVERESIZE ] ,
xwm - > atoms [ NET_WM_STATE_FOCUSED ] ,
xwm - > atoms [ NET_WM_STATE_MODAL ] ,
xwm - > atoms [ NET_WM_STATE_FULLSCREEN ] ,
xwm - > atoms [ NET_WM_STATE_MAXIMIZED_VERT ] ,