[PATCH 1/2] window: Fix sending button events when there's no grab

Neil Roberts neil at linux.intel.com
Mon Jan 23 11:11:18 PST 2012

The code which sends the button events was checking whether there is a
focus widget with a button handler but then always sending the button
event to the grab widget. If the grab widget is different from the
focus widget at this point then it will check the wrong widget for a
button handler and potentially crash. It is also possible for there to
be no grab widget here in the following situation:

1. Press and hold down the left mouse button
2. Press and hold down the right mouse button
3. Release the left mouse button
4. Release the right mouse button

In this case the grab will be released at step 3 because the code only
keeps track of the grab for one button. Then it will try to send the
release event for the right mouse button to a NULL widget so it will
 clients/window.c |   10 +++++-----
 1 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/clients/window.c b/clients/window.c
index fe7508d..1356c75 100644
--- a/clients/window.c
+++ b/clients/window.c
@@ -1527,12 +1527,12 @@ input_handle_button(void *data,
 	if (input->focus_widget && input->grab == NULL && state)
 		input_grab(input, input->focus_widget, button);
-	widget = input->focus_widget;
+	widget = input->grab;
 	if (widget && widget->button_handler)
-		(*input->grab->button_handler)(widget,
-					       input, time,
-					       button, state,
-					       input->grab->user_data);
+		(*widget->button_handler)(widget,
+					  input, time,
+					  button, state,
+					  input->grab->user_data);
 	if (input->grab && input->grab_button == button && !state)
 		input_ungrab(input, time);

More information about the wayland-devel mailing list