xwm: remove incorrect implementation of net wm state
This commit is contained in:
		
							parent
							
								
									32b848bd46
								
							
						
					
					
						commit
						4a106648c4
					
				|  | @ -96,6 +96,11 @@ struct wlr_xwayland_surface { | |||
| 	uint32_t hints_urgency; | ||||
| 	struct wlr_xwayland_surface_size_hints *size_hints; | ||||
| 
 | ||||
| 	// _NET_WM_STATE
 | ||||
| 	bool fullscreen; | ||||
| 	bool maximized_vert; | ||||
| 	bool maximized_horz; | ||||
| 
 | ||||
| 	struct { | ||||
| 		struct wl_signal destroy; | ||||
| 		struct wl_signal request_configure; | ||||
|  |  | |||
|  | @ -36,6 +36,9 @@ const char *atom_map[ATOM_LAST] = { | |||
| 	"_NET_WM_MOVERESIZE", | ||||
| 	"_NET_WM_NAME", | ||||
| 	"_NET_SUPPORTING_WM_CHECK", | ||||
| 	"_NET_WM_STATE_FULLSCREEN", | ||||
| 	"_NET_WM_STATE_MAXIMIZED_VERT", | ||||
| 	"_NET_WM_STATE_MAXIMIZED_HORZ", | ||||
| }; | ||||
| 
 | ||||
| /* General helpers */ | ||||
|  | @ -150,6 +153,30 @@ void xwm_surface_activate(struct wlr_xwm *xwm, | |||
| 	xcb_flush(xwm->xcb_conn); | ||||
| } | ||||
| 
 | ||||
| static void xsurface_set_net_wm_state(struct wlr_xwayland_surface *xsurface) { | ||||
| 	struct wlr_xwm *xwm = xsurface->xwm; | ||||
| 	uint32_t property[3]; | ||||
| 	int i; | ||||
| 
 | ||||
| 	i = 0; | ||||
| 	if (xsurface->fullscreen) { | ||||
| 		property[i++] = xwm->atoms[_NET_WM_STATE_FULLSCREEN]; | ||||
| 	} | ||||
| 	if (xsurface->maximized_vert) { | ||||
| 		property[i++] = xwm->atoms[_NET_WM_STATE_MAXIMIZED_VERT]; | ||||
| 	} | ||||
| 	if (xsurface->maximized_horz) { | ||||
| 		property[i++] = xwm->atoms[_NET_WM_STATE_MAXIMIZED_HORZ]; | ||||
| 	} | ||||
| 
 | ||||
| 	xcb_change_property(xwm->xcb_conn, | ||||
| 		XCB_PROP_MODE_REPLACE, | ||||
| 		xsurface->window_id, | ||||
| 		xwm->atoms[NET_WM_STATE], | ||||
| 		XCB_ATOM_ATOM, | ||||
| 		32, // format
 | ||||
| 		i, property); | ||||
| } | ||||
| 
 | ||||
| static void wlr_xwayland_surface_destroy(struct wlr_xwayland_surface *surface) { | ||||
| 	wl_signal_emit(&surface->events.destroy, surface); | ||||
|  | @ -271,44 +298,6 @@ static void read_surface_parent(struct wlr_xwm *xwm, | |||
| 	wl_signal_emit(&surface->events.set_parent, surface); | ||||
| } | ||||
| 
 | ||||
| static void handle_surface_state(struct wlr_xwm *xwm, | ||||
| 		struct wlr_xwayland_surface *surface, xcb_atom_t *state, | ||||
| 		size_t state_len, enum net_wm_state_action action) { | ||||
| 	for (size_t i = 0; i < state_len; i++) { | ||||
| 		xcb_atom_t atom = state[i]; | ||||
| 		bool found = false; | ||||
| 		for (size_t j = 0; j < surface->state->length; j++) { | ||||
| 			xcb_atom_t *cur = surface->state->items[j]; | ||||
| 			if (atom == *cur) { | ||||
| 				found = true; | ||||
| 				if (action == NET_WM_STATE_REMOVE || | ||||
| 						action == NET_WM_STATE_TOGGLE) { | ||||
| 					free(surface->state->items[j]); | ||||
| 					wlr_list_del(surface->state, j); | ||||
| 				} | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		if (!found && (action == NET_WM_STATE_ADD || | ||||
| 				action == NET_WM_STATE_TOGGLE)) { | ||||
| 			xcb_atom_t *atom_ptr = malloc(sizeof(xcb_atom_t)); | ||||
| 			*atom_ptr = atom; | ||||
| 			wlr_list_add(surface->state, atom_ptr); | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	wlr_log(L_DEBUG, "NET_WM_STATE (%zu)", state_len); | ||||
| 	wl_signal_emit(&surface->events.set_state, surface); | ||||
| } | ||||
| 
 | ||||
| static void read_surface_state(struct wlr_xwm *xwm, | ||||
| 		struct wlr_xwayland_surface *surface, xcb_get_property_reply_t *reply) { | ||||
| 	// reply->type == XCB_ATOM_ANY
 | ||||
| 	handle_surface_state(xwm, surface, xcb_get_property_value(reply), | ||||
| 		reply->value_len, NET_WM_STATE_ADD); | ||||
| } | ||||
| 
 | ||||
| static void read_surface_pid(struct wlr_xwm *xwm, | ||||
| 		struct wlr_xwayland_surface *surface, xcb_get_property_reply_t *reply) { | ||||
| 	if (reply->type != XCB_ATOM_CARDINAL) { | ||||
|  | @ -480,7 +469,7 @@ static void read_surface_property(struct wlr_xwm *xwm, | |||
| 	} else if (property == xwm->atoms[WM_PROTOCOLS]) { | ||||
| 		read_surface_protocols(xwm, surface, reply); | ||||
| 	} else if (property == xwm->atoms[NET_WM_STATE]) { | ||||
| 		read_surface_state(xwm, surface, reply); | ||||
| 		wlr_log(L_DEBUG, "TODO: read _NET_WM_STATE property"); | ||||
| 	} else if (property == xwm->atoms[WM_HINTS]) { | ||||
| 		read_surface_hints(xwm, surface, reply); | ||||
| 	} else if (property == xwm->atoms[WM_NORMAL_HINTS]) { | ||||
|  | @ -645,6 +634,7 @@ static void handle_map_request(struct wlr_xwm *xwm, | |||
| 	} | ||||
| 
 | ||||
| 	xsurface_set_wm_state(xsurface, ICCCM_NORMAL_STATE); | ||||
| 	xsurface_set_net_wm_state(xsurface); | ||||
| 	xcb_map_window(xwm->xcb_conn, ev->window); | ||||
| } | ||||
| 
 | ||||
|  | @ -716,16 +706,6 @@ static void handle_surface_id_message(struct wlr_xwm *xwm, | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| static void handle_net_wm_state_message(struct wlr_xwm *xwm, | ||||
| 		xcb_client_message_event_t *ev) { | ||||
| 	struct wlr_xwayland_surface *xsurface = lookup_surface(xwm, ev->window); | ||||
| 	if (xsurface == NULL) { | ||||
| 		return; | ||||
| 	} | ||||
| 	handle_surface_state(xwm, xsurface, &ev->data.data32[1], 2, | ||||
| 		ev->data.data32[0]); | ||||
| } | ||||
| 
 | ||||
| static void handle_net_wm_moveresize_message(struct wlr_xwm *xwm, | ||||
| 		xcb_client_message_event_t *ev) { | ||||
| 	wlr_log(L_DEBUG, "TODO: handle moveresize"); | ||||
|  | @ -738,7 +718,7 @@ static void handle_client_message(struct wlr_xwm *xwm, | |||
| 	if (ev->type == xwm->atoms[WL_SURFACE_ID]) { | ||||
| 		handle_surface_id_message(xwm, ev); | ||||
| 	} else if (ev->type == xwm->atoms[NET_WM_STATE]) { | ||||
| 		handle_net_wm_state_message(xwm, ev); | ||||
| 		wlr_log(L_DEBUG, "TODO: handle _NET_WM_STATE client message"); | ||||
| 	} else if (ev->type == xwm->atoms[_NET_WM_MOVERESIZE]) { | ||||
| 		handle_net_wm_moveresize_message(xwm, ev); | ||||
| 	} else { | ||||
|  | @ -1075,6 +1055,8 @@ struct wlr_xwm *xwm_create(struct wlr_xwayland *wlr_xwayland) { | |||
| 		sizeof(supported)/sizeof(*supported), | ||||
| 		supported); | ||||
| 
 | ||||
| 	xcb_flush(xwm->xcb_conn); | ||||
| 
 | ||||
| 	xwm_set_net_active_window(xwm, XCB_WINDOW_NONE); | ||||
| 
 | ||||
| 	xwm->compositor_surface_create.notify = handle_compositor_surface_create; | ||||
|  |  | |||
|  | @ -25,6 +25,9 @@ enum atom_name { | |||
| 	_NET_WM_MOVERESIZE, | ||||
| 	_NET_WM_NAME, | ||||
| 	_NET_SUPPORTING_WM_CHECK, | ||||
| 	_NET_WM_STATE_FULLSCREEN, | ||||
| 	_NET_WM_STATE_MAXIMIZED_VERT, | ||||
| 	_NET_WM_STATE_MAXIMIZED_HORZ, | ||||
| 	ATOM_LAST, | ||||
| }; | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue