aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/sway/tree/view.h3
-rw-r--r--sway/desktop/xwayland.c5
-rw-r--r--sway/ipc-json.c23
-rw-r--r--sway/tree/view.c7
4 files changed, 38 insertions, 0 deletions
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h
index dc1f0b02..a8fa1660 100644
--- a/include/sway/tree/view.h
+++ b/include/sway/tree/view.h
@@ -30,6 +30,7 @@ enum sway_view_prop {
30 VIEW_PROP_WINDOW_ROLE, 30 VIEW_PROP_WINDOW_ROLE,
31#ifdef HAVE_XWAYLAND 31#ifdef HAVE_XWAYLAND
32 VIEW_PROP_X11_WINDOW_ID, 32 VIEW_PROP_X11_WINDOW_ID,
33 VIEW_PROP_X11_PARENT_ID,
33#endif 34#endif
34}; 35};
35 36
@@ -257,6 +258,8 @@ const char *view_get_instance(struct sway_view *view);
257 258
258uint32_t view_get_x11_window_id(struct sway_view *view); 259uint32_t view_get_x11_window_id(struct sway_view *view);
259 260
261uint32_t view_get_x11_parent_id(struct sway_view *view);
262
260const char *view_get_window_role(struct sway_view *view); 263const char *view_get_window_role(struct sway_view *view);
261 264
262uint32_t view_get_window_type(struct sway_view *view); 265uint32_t view_get_window_type(struct sway_view *view);
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c
index b8ac8434..a8fbd574 100644
--- a/sway/desktop/xwayland.c
+++ b/sway/desktop/xwayland.c
@@ -171,6 +171,11 @@ static uint32_t get_int_prop(struct sway_view *view, enum sway_view_prop prop) {
171 switch (prop) { 171 switch (prop) {
172 case VIEW_PROP_X11_WINDOW_ID: 172 case VIEW_PROP_X11_WINDOW_ID:
173 return view->wlr_xwayland_surface->window_id; 173 return view->wlr_xwayland_surface->window_id;
174 case VIEW_PROP_X11_PARENT_ID:
175 if (view->wlr_xwayland_surface->parent) {
176 return view->wlr_xwayland_surface->parent->window_id;
177 }
178 return 0;
174 case VIEW_PROP_WINDOW_TYPE: 179 case VIEW_PROP_WINDOW_TYPE:
175 return *view->wlr_xwayland_surface->window_type; 180 return *view->wlr_xwayland_surface->window_type;
176 default: 181 default:
diff --git a/sway/ipc-json.c b/sway/ipc-json.c
index a29647ed..2cd0cb2d 100644
--- a/sway/ipc-json.c
+++ b/sway/ipc-json.c
@@ -266,6 +266,29 @@ static void ipc_json_describe_view(struct sway_container *c, json_object *object
266 if (c->view->type == SWAY_VIEW_XWAYLAND) { 266 if (c->view->type == SWAY_VIEW_XWAYLAND) {
267 json_object_object_add(object, "window", 267 json_object_object_add(object, "window",
268 json_object_new_int(view_get_x11_window_id(c->view))); 268 json_object_new_int(view_get_x11_window_id(c->view)));
269
270 json_object *window_props = json_object_new_object();
271
272 json_object_object_add(window_props, "class",
273 class ? json_object_new_string(class) : NULL);
274 const char *instance = view_get_instance(c->view);
275 json_object_object_add(window_props, "instance",
276 instance ? json_object_new_string(instance) : NULL);
277 json_object_object_add(window_props, "title",
278 c->title ? json_object_new_string(c->title) : NULL);
279
280 // the transient_for key is always present in i3's output
281 uint32_t parent_id = view_get_x11_parent_id(c->view);
282 json_object_object_add(window_props, "transient_for",
283 parent_id ? json_object_new_int(parent_id) : NULL);
284
285 const char *role = view_get_window_role(c->view);
286 if (role) {
287 json_object_object_add(window_props, "window_role",
288 json_object_new_string(role));
289 }
290
291 json_object_object_add(object, "window_properties", window_props);
269 } 292 }
270#endif 293#endif
271} 294}
diff --git a/sway/tree/view.c b/sway/tree/view.c
index b23afb97..3698d7d5 100644
--- a/sway/tree/view.c
+++ b/sway/tree/view.c
@@ -116,6 +116,13 @@ uint32_t view_get_x11_window_id(struct sway_view *view) {
116 } 116 }
117 return 0; 117 return 0;
118} 118}
119
120uint32_t view_get_x11_parent_id(struct sway_view *view) {
121 if (view->impl->get_int_prop) {
122 return view->impl->get_int_prop(view, VIEW_PROP_X11_PARENT_ID);
123 }
124 return 0;
125}
119#endif 126#endif
120const char *view_get_window_role(struct sway_view *view) { 127const char *view_get_window_role(struct sway_view *view) {
121 if (view->impl->get_string_prop) { 128 if (view->impl->get_string_prop) {