[PATCH weston v2 10/24] xwm: clarify props[] in weston_wm_window_read_properties()
Quentin Glidic
sardemff7+wayland at sardemff7.net
Sun Jan 15 13:47:10 UTC 2017
On 21/12/2016 15:40, Pekka Paalanen wrote:
> From: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
>
> The props array contained offsets to struct members. It is convenient
> for writing static const arrays as you only store a constant offset and
> compute the pointer later. However, the array was not static to begin
> with, the atoms are not build time constants. We can as well just store
> the pointer directly in the array.
>
> Entries that did not use the offset had bogus offsets, producing
> pointers to arbitrary fields. They are changed to have a NULL pointer.
> If the code unintentionally used the pointer, it will now explode rather
> than corrupt memory.
>
> Also explain the use of the #defined constants and #undef them when they
> get out of scope. This clearly documents that they are just a convenient
> hack to avoid lots of special cases in the function.
>
> Signed-off-by: Pekka Paalanen <pekka.paalanen at collabora.co.uk>
Much cleaner:
Reviewed-by: Quentin Glidic <sardemff7+git at sardemff7.net>
Thanks,
> ---
> xwayland/window-manager.c | 38 +++++++++++++++++++++++---------------
> 1 file changed, 23 insertions(+), 15 deletions(-)
>
> diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
> index 02a44a7..c4220ab 100644
> --- a/xwayland/window-manager.c
> +++ b/xwayland/window-manager.c
> @@ -443,7 +443,10 @@ read_and_dump_property(struct weston_wm *wm,
> free(reply);
> }
>
> -/* We reuse some predefined, but otherwise useles atoms */
> +/* We reuse some predefined, but otherwise useles atoms
> + * as local type placeholders that never touch the X11 server,
> + * to make weston_wm_window_read_properties() less exceptional.
> + */
> #define TYPE_WM_PROTOCOLS XCB_ATOM_CUT_BUFFER0
> #define TYPE_MOTIF_WM_HINTS XCB_ATOM_CUT_BUFFER1
> #define TYPE_NET_WM_STATE XCB_ATOM_CUT_BUFFER2
> @@ -456,23 +459,23 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
> const struct weston_desktop_xwayland_interface *xwayland_interface =
> wm->server->compositor->xwayland_interface;
>
> -#define F(field) offsetof(struct weston_wm_window, field)
> +#define F(field) (&window->field)
> const struct {
> xcb_atom_t atom;
> xcb_atom_t type;
> - int offset;
> + void *ptr;
> } props[] = {
> - { XCB_ATOM_WM_CLASS, XCB_ATOM_STRING, F(class) },
> - { XCB_ATOM_WM_NAME, XCB_ATOM_STRING, F(name) },
> - { XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, F(transient_for) },
> - { wm->atom.wm_protocols, TYPE_WM_PROTOCOLS, F(protocols) },
> - { wm->atom.wm_normal_hints, TYPE_WM_NORMAL_HINTS, F(protocols) },
> - { wm->atom.net_wm_state, TYPE_NET_WM_STATE },
> - { wm->atom.net_wm_window_type, XCB_ATOM_ATOM, F(type) },
> - { wm->atom.net_wm_name, XCB_ATOM_STRING, F(name) },
> - { wm->atom.net_wm_pid, XCB_ATOM_CARDINAL, F(pid) },
> - { wm->atom.motif_wm_hints, TYPE_MOTIF_WM_HINTS, 0 },
> - { wm->atom.wm_client_machine, XCB_ATOM_WM_CLIENT_MACHINE, F(machine) },
> + { XCB_ATOM_WM_CLASS, XCB_ATOM_STRING, F(class) },
> + { XCB_ATOM_WM_NAME, XCB_ATOM_STRING, F(name) },
> + { XCB_ATOM_WM_TRANSIENT_FOR, XCB_ATOM_WINDOW, F(transient_for) },
> + { wm->atom.wm_protocols, TYPE_WM_PROTOCOLS, NULL },
> + { wm->atom.wm_normal_hints, TYPE_WM_NORMAL_HINTS, NULL },
> + { wm->atom.net_wm_state, TYPE_NET_WM_STATE, NULL },
> + { wm->atom.net_wm_window_type, XCB_ATOM_ATOM, F(type) },
> + { wm->atom.net_wm_name, XCB_ATOM_STRING, F(name) },
> + { wm->atom.net_wm_pid, XCB_ATOM_CARDINAL, F(pid) },
> + { wm->atom.motif_wm_hints, TYPE_MOTIF_WM_HINTS, NULL },
> + { wm->atom.wm_client_machine, XCB_ATOM_WM_CLIENT_MACHINE, F(machine) },
> };
> #undef F
>
> @@ -511,7 +514,7 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
> continue;
> }
>
> - p = ((char *) window + props[i].offset);
> + p = props[i].ptr;
>
> switch (props[i].type) {
> case XCB_ATOM_WM_CLIENT_MACHINE:
> @@ -605,6 +608,11 @@ weston_wm_window_read_properties(struct weston_wm_window *window)
> xwayland_interface->set_pid(window->shsurf, window->pid);
> }
>
> +#undef TYPE_WM_PROTOCOLS
> +#undef TYPE_MOTIF_WM_HINTS
> +#undef TYPE_NET_WM_STATE
> +#undef TYPE_WM_NORMAL_HINTS
> +
> static void
> weston_wm_window_get_frame_size(struct weston_wm_window *window,
> int *width, int *height)
>
--
Quentin “Sardem FF7” Glidic
More information about the wayland-devel
mailing list