mirror of
https://github.com/hyprwm/wlroots-hyprland.git
synced 2024-11-26 06:35:58 +01:00
Merge pull request #1226 from RyanDwyer/xwayland-set-role
xwayland: Introduce set_role event
This commit is contained in:
commit
d31a267f36
3 changed files with 30 additions and 0 deletions
|
@ -116,6 +116,7 @@ struct wlr_xwayland_surface {
|
||||||
char *title;
|
char *title;
|
||||||
char *class;
|
char *class;
|
||||||
char *instance;
|
char *instance;
|
||||||
|
char *role;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
bool has_utf8_title;
|
bool has_utf8_title;
|
||||||
|
|
||||||
|
@ -157,6 +158,7 @@ struct wlr_xwayland_surface {
|
||||||
struct wl_signal unmap;
|
struct wl_signal unmap;
|
||||||
struct wl_signal set_title;
|
struct wl_signal set_title;
|
||||||
struct wl_signal set_class;
|
struct wl_signal set_class;
|
||||||
|
struct wl_signal set_role;
|
||||||
struct wl_signal set_parent;
|
struct wl_signal set_parent;
|
||||||
struct wl_signal set_pid;
|
struct wl_signal set_pid;
|
||||||
struct wl_signal set_window_type;
|
struct wl_signal set_window_type;
|
||||||
|
|
|
@ -25,6 +25,7 @@ enum atom_name {
|
||||||
WM_HINTS,
|
WM_HINTS,
|
||||||
WM_NORMAL_HINTS,
|
WM_NORMAL_HINTS,
|
||||||
WM_SIZE_HINTS,
|
WM_SIZE_HINTS,
|
||||||
|
WM_WINDOW_ROLE,
|
||||||
MOTIF_WM_HINTS,
|
MOTIF_WM_HINTS,
|
||||||
UTF8_STRING,
|
UTF8_STRING,
|
||||||
WM_S0,
|
WM_S0,
|
||||||
|
|
|
@ -24,6 +24,7 @@ const char *atom_map[ATOM_LAST] = {
|
||||||
"WM_HINTS",
|
"WM_HINTS",
|
||||||
"WM_NORMAL_HINTS",
|
"WM_NORMAL_HINTS",
|
||||||
"WM_SIZE_HINTS",
|
"WM_SIZE_HINTS",
|
||||||
|
"WM_WINDOW_ROLE",
|
||||||
"_MOTIF_WM_HINTS",
|
"_MOTIF_WM_HINTS",
|
||||||
"UTF8_STRING",
|
"UTF8_STRING",
|
||||||
"WM_S0",
|
"WM_S0",
|
||||||
|
@ -152,6 +153,7 @@ static struct wlr_xwayland_surface *xwayland_surface_create(
|
||||||
wl_signal_init(&surface->events.map);
|
wl_signal_init(&surface->events.map);
|
||||||
wl_signal_init(&surface->events.unmap);
|
wl_signal_init(&surface->events.unmap);
|
||||||
wl_signal_init(&surface->events.set_class);
|
wl_signal_init(&surface->events.set_class);
|
||||||
|
wl_signal_init(&surface->events.set_role);
|
||||||
wl_signal_init(&surface->events.set_title);
|
wl_signal_init(&surface->events.set_title);
|
||||||
wl_signal_init(&surface->events.set_parent);
|
wl_signal_init(&surface->events.set_parent);
|
||||||
wl_signal_init(&surface->events.set_pid);
|
wl_signal_init(&surface->events.set_pid);
|
||||||
|
@ -327,6 +329,7 @@ static void xwayland_surface_destroy(
|
||||||
free(xsurface->title);
|
free(xsurface->title);
|
||||||
free(xsurface->class);
|
free(xsurface->class);
|
||||||
free(xsurface->instance);
|
free(xsurface->instance);
|
||||||
|
free(xsurface->role);
|
||||||
free(xsurface->window_type);
|
free(xsurface->window_type);
|
||||||
free(xsurface->protocols);
|
free(xsurface->protocols);
|
||||||
free(xsurface->hints);
|
free(xsurface->hints);
|
||||||
|
@ -365,6 +368,28 @@ static void read_surface_class(struct wlr_xwm *xwm,
|
||||||
wlr_signal_emit_safe(&surface->events.set_class, surface);
|
wlr_signal_emit_safe(&surface->events.set_class, surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void read_surface_role(struct wlr_xwm *xwm,
|
||||||
|
struct wlr_xwayland_surface *xsurface,
|
||||||
|
xcb_get_property_reply_t *reply) {
|
||||||
|
if (reply->type != XCB_ATOM_STRING &&
|
||||||
|
reply->type != xwm->atoms[UTF8_STRING]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t len = xcb_get_property_value_length(reply);
|
||||||
|
char *role = xcb_get_property_value(reply);
|
||||||
|
|
||||||
|
free(xsurface->role);
|
||||||
|
if (len > 0) {
|
||||||
|
xsurface->role = strndup(role, len);
|
||||||
|
} else {
|
||||||
|
xsurface->role = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
wlr_log(WLR_DEBUG, "XCB_ATOM_WM_WINDOW_ROLE: %s", xsurface->role);
|
||||||
|
wlr_signal_emit_safe(&xsurface->events.set_role, xsurface);
|
||||||
|
}
|
||||||
|
|
||||||
static void read_surface_title(struct wlr_xwm *xwm,
|
static void read_surface_title(struct wlr_xwm *xwm,
|
||||||
struct wlr_xwayland_surface *xsurface,
|
struct wlr_xwayland_surface *xsurface,
|
||||||
xcb_get_property_reply_t *reply) {
|
xcb_get_property_reply_t *reply) {
|
||||||
|
@ -638,6 +663,8 @@ static void read_surface_property(struct wlr_xwm *xwm,
|
||||||
read_surface_normal_hints(xwm, xsurface, reply);
|
read_surface_normal_hints(xwm, xsurface, reply);
|
||||||
} else if (property == xwm->atoms[MOTIF_WM_HINTS]) {
|
} else if (property == xwm->atoms[MOTIF_WM_HINTS]) {
|
||||||
read_surface_motif_hints(xwm, xsurface, reply);
|
read_surface_motif_hints(xwm, xsurface, reply);
|
||||||
|
} else if (property == xwm->atoms[WM_WINDOW_ROLE]) {
|
||||||
|
read_surface_role(xwm, xsurface, reply);
|
||||||
} else {
|
} else {
|
||||||
char *prop_name = xwm_get_atom_name(xwm, property);
|
char *prop_name = xwm_get_atom_name(xwm, property);
|
||||||
wlr_log(WLR_DEBUG, "unhandled X11 property %u (%s) for window %u",
|
wlr_log(WLR_DEBUG, "unhandled X11 property %u (%s) for window %u",
|
||||||
|
|
Loading…
Reference in a new issue