It crashes in set_title, when called by one of the functions in
XWayland window manager. Looks like it try to free something it isn't
allowed to free (maybe is in use?).
I get the crash with firefox after less than 1 minute playing with the
menus, and with vlc when looking a video and moving the mouse at the
same time during a few minutes.
If I remove the two calls to set_title in XWayland (removing only one
doesn't remove the crash), it fixes the crash.
Axel Davy
On Mon, 16 Sep 2013, Giulio Camuffo wrote:
How does it crash? And when doing what?
Giulio
2013/9/15 Axel Davy <d...@clipper.ens.fr>
This patch makes XWayland often crash for me.
Axel Davy
Le 11/09/2013 18:20, Giulio Camuffo a écrit :
add a new function pointer to the
weston_shell_interface struct that
shells will set accordingly.
---
src/compositor.h | 2 ++
src/shell.c | 11 +++++++++--
src/xwayland/window-manager.c | 11 +++++++++++
3 files changed, 22 insertions(+), 2 deletions(-)
diff --git a/src/compositor.h b/src/compositor.h
index 3c1b643..ead0c91 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -107,6 +107,8 @@ struct weston_shell_interface {
int (*move)(struct shell_surface *shsurf,
struct weston_seat *ws);
int (*resize)(struct shell_surface *shsurf,
struct weston_seat *ws,
uint32_t edges);
+ void (*set_title)(struct shell_surface
*shsurf,
+ const char *title);
};
diff --git a/src/shell.c b/src/shell.c
index dc15bfa..ea4315a 100644
--- a/src/shell.c
+++ b/src/shell.c
@@ -1595,13 +1595,19 @@ shell_surface_pong(struct
wl_client *client, struct wl_resource *resource,
}
static void
+set_title(struct shell_surface *shsurf, const char
*title)
+{
+ free(shsurf->title);
+ shsurf->title = strdup(title);
+}
+
+static void
shell_surface_set_title(struct wl_client *client,
struct wl_resource
*resource, const char *title)
{
struct shell_surface *shsurf =
wl_resource_get_user_data(resource);
- free(shsurf->title);
- shsurf->title = strdup(title);
+ set_title(shsurf, title);
}
static void
@@ -4583,6 +4589,7 @@ module_init(struct
weston_compositor *ec,
ec->shell_interface.set_xwayland =
set_xwayland;
ec->shell_interface.move = surface_move;
ec->shell_interface.resize = surface_resize;
+ ec->shell_interface.set_title = set_title;
wl_list_init(&shell->input_panel.surfaces);
diff --git a/src/xwayland/window-manager.c
b/src/xwayland/window-manager.c
index f775734..b4f64d3 100644
--- a/src/xwayland/window-manager.c
+++ b/src/xwayland/window-manager.c
@@ -363,6 +363,8 @@ static void
weston_wm_window_read_properties(struct
weston_wm_window *window)
{
struct weston_wm *wm = window->wm;
+ struct weston_shell_interface
*shell_interface =
+
&wm->server->compositor->shell_interface;
#define F(field) offsetof(struct weston_wm_window,
field)
const struct {
@@ -468,6 +470,9 @@
weston_wm_window_read_properties(struct
weston_wm_window *window)
}
free(reply);
}
+
+ if (window->shsurf && window->name)
+
shell_interface->set_title(window->shsurf,
window->name);
}
static void
@@ -1875,6 +1880,9 @@ surface_destroy(struct
wl_listener *listener, void *data)
wm_log("surface for xid %d destroyed\n",
window->id);
+ /* This should have been freed by the shell.
+ Don't try to use it later. */
+ window->shsurf = NULL;
window->surface = NULL;
}
@@ -2029,6 +2037,9 @@
xserver_map_shell_surface(struct weston_wm *wm,
window->surface,
&shell_client);
+ if (window->name)
+
shell_interface->set_title(window->shsurf,
window->name);
+
if (window->fullscreen) {
window->saved_width = window->width;
window->saved_height =
window->height;
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel