diff options
-rw-r--r-- | include/sway/tree/view.h | 3 | ||||
-rw-r--r-- | sway/desktop/xwayland.c | 5 | ||||
-rw-r--r-- | sway/ipc-json.c | 23 | ||||
-rw-r--r-- | sway/tree/view.c | 7 |
4 files changed, 38 insertions, 0 deletions
diff --git a/include/sway/tree/view.h b/include/sway/tree/view.h index a0b4dd46..0240f294 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 | ||
@@ -256,6 +257,8 @@ const char *view_get_instance(struct sway_view *view); | |||
256 | 257 | ||
257 | uint32_t view_get_x11_window_id(struct sway_view *view); | 258 | uint32_t view_get_x11_window_id(struct sway_view *view); |
258 | 259 | ||
260 | uint32_t view_get_x11_parent_id(struct sway_view *view); | ||
261 | |||
259 | const char *view_get_window_role(struct sway_view *view); | 262 | const char *view_get_window_role(struct sway_view *view); |
260 | 263 | ||
261 | uint32_t view_get_window_type(struct sway_view *view); | 264 | uint32_t view_get_window_type(struct sway_view *view); |
diff --git a/sway/desktop/xwayland.c b/sway/desktop/xwayland.c index 5305ce12..d1aec084 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 a8486dd7..20babf7b 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 | |||
120 | uint32_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 |
120 | const char *view_get_window_role(struct sway_view *view) { | 127 | const char *view_get_window_role(struct sway_view *view) { |
121 | if (view->impl->get_string_prop) { | 128 | if (view->impl->get_string_prop) { |