Merge lp:~bregma/libgrip/lp-827958 into lp:libgrip

Proposed by Stephen M. Webb
Status: Superseded
Proposed branch: lp:~bregma/libgrip/lp-827958
Merge into: lp:libgrip
Diff against target: 70 lines (+23/-19)
1 file modified
src/gripgesturemanager.c (+23/-19)
To merge this branch: bzr merge lp:~bregma/libgrip/lp-827958
Reviewer Review Type Date Requested Status
Stephen M. Webb (community) Needs Resubmitting
Review via email: mp+78473@code.launchpad.net

This proposal has been superseded by a proposal from 2011-10-06.

Description of the change

Registers only those widgets whose toplevel was just mapped in the window-mapped callback.

Previously, an attempt to register ALL pending widgets regardless of toplevel was causing an occasional segfault.

To post a comment you must log in.
Revision history for this message
Stephen M. Webb (bregma) wrote :

A quick re-review of this fix reveals it introduces another bug.

review: Needs Resubmitting
lp:~bregma/libgrip/lp-827958 updated
64. By Stephen M. Webb

Fixed invalid deletion of all registration requests in window mapping.

65. By Stephen M. Webb

Renamed window_mapped_cb to toplevel_mapped_cb to reduce confusion.

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/gripgesturemanager.c'
2--- src/gripgesturemanager.c 2011-09-22 19:55:37 +0000
3+++ src/gripgesturemanager.c 2011-10-06 19:27:27 +0000
4@@ -1253,7 +1253,7 @@
5 GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
6 GripRegistrationRequest *req = (GripRegistrationRequest *)user_data;
7
8- if (GTK_IS_WINDOW (toplevel))
9+ if (gtk_widget_is_toplevel (toplevel))
10 {
11 g_signal_handlers_disconnect_by_func (widget,
12 G_CALLBACK (toplevel_notify_cb),
13@@ -1316,7 +1316,7 @@
14 {
15 GtkWidget *toplevel = gtk_widget_get_toplevel (widget);
16
17- if (GTK_IS_WINDOW (toplevel))
18+ if (gtk_widget_is_toplevel (toplevel))
19 {
20 register_internal (manager,
21 widget,
22@@ -1354,27 +1354,31 @@
23 {
24 GripGestureManager *manager = (GripGestureManager *)user_data;
25 GripGestureManagerPrivate *priv = manager->priv;
26- GList *tmp;
27+ GList *request = priv->requests;
28
29- for (tmp = priv->requests; tmp != NULL; tmp = tmp->next)
30+ while (request)
31 {
32- GripRegistrationRequest *req = tmp->data;
33-
34- register_widget (req->manager,
35- req->widget,
36- req->gesture_type,
37- req->device_type,
38- req->touch_points,
39- req->callback,
40- req->user_data,
41- req->destroy);
42-
43- g_free (req);
44+ GList *next = request->next;
45+ GripRegistrationRequest *req = request->data;
46+
47+ if (gtk_widget_get_toplevel (req->widget) == widget)
48+ {
49+ register_widget (req->manager,
50+ req->widget,
51+ req->gesture_type,
52+ req->device_type,
53+ req->touch_points,
54+ req->callback,
55+ req->user_data,
56+ req->destroy);
57+
58+ priv->requests = g_list_remove_link (priv->requests, request);
59+ g_free (req);
60+ g_list_free_1 (request);
61+ }
62+ request = next;
63 }
64
65- g_list_free (priv->requests);
66- priv->requests = NULL;
67-
68 g_signal_handlers_disconnect_by_func (widget,
69 window_mapped_cb,
70 user_data);

Subscribers

People subscribed via source and target branches