summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoss Lagerwall <rosslagerwall@gmail.com>2015-03-09 18:25:06 +0000
committerRoss Lagerwall <rosslagerwall@gmail.com>2015-03-11 23:01:53 +0000
commit3fe654aad79cdc549950018f2cff9bc87128ee83 (patch)
treedf09f06833bace463c26640a1a6836000b87f772
parente113f00125afefe98a14e56d4a722e28c6f9e8dc (diff)
downloadnautilus-3fe654aad79cdc549950018f2cff9bc87128ee83.tar.gz
Register double-click on button release
Only perform the double-click action when the second click is released. This fixes a strange problem where double-clicking on a password-protected webdav share (as exported by gnome-user-share) fails to show the password dialog (which gnome-shell does) due to Nautilus holding a grab. By only taking action when the click is released, Nautilus is not holding a grab and the password dialog is shown. When it fails, the following is shown in the log: gnome-session[20151]: Gjs-Message: JS LOG: pushModal: invocation of begin_modal failed https://bugzilla.gnome.org/show_bug.cgi?id=745859
-rw-r--r--libnautilus-private/nautilus-canvas-container.c28
-rw-r--r--libnautilus-private/nautilus-canvas-private.h1
2 files changed, 20 insertions, 9 deletions
diff --git a/libnautilus-private/nautilus-canvas-container.c b/libnautilus-private/nautilus-canvas-container.c
index 14848a9a1..705db9d2a 100644
--- a/libnautilus-private/nautilus-canvas-container.c
+++ b/libnautilus-private/nautilus-canvas-container.c
@@ -5310,14 +5310,8 @@ handle_canvas_double_click (NautilusCanvasContainer *container,
clicked_within_double_click_interval (container) &&
details->double_click_icon[0] == details->double_click_icon[1] &&
details->double_click_button[0] == details->double_click_button[1]) {
- if (!button_event_modifies_selection (event)) {
- activate_selected_items (container);
- return TRUE;
- } else if ((event->state & GDK_CONTROL_MASK) == 0 &&
- (event->state & GDK_SHIFT_MASK) != 0) {
- activate_selected_items_alternate (container, icon);
- return TRUE;
- }
+ details->double_clicked = TRUE;
+ return TRUE;
}
return FALSE;
@@ -5440,22 +5434,38 @@ item_event_callback (EelCanvasItem *item,
{
NautilusCanvasContainer *container;
NautilusCanvasIcon *icon;
+ GdkEventButton *event_button;
container = NAUTILUS_CANVAS_CONTAINER (data);
icon = NAUTILUS_CANVAS_ITEM (item)->user_data;
g_assert (icon != NULL);
+ event_button = &event->button;
+
switch (event->type) {
case GDK_BUTTON_PRESS:
- if (handle_canvas_button_press (container, icon, &event->button)) {
+ container->details->double_clicked = FALSE;
+ if (handle_canvas_button_press (container, icon, event_button)) {
/* Stop the event from being passed along further. Returning
* TRUE ain't enough.
*/
return TRUE;
}
return FALSE;
+ case GDK_BUTTON_RELEASE:
+ if (event_button->button == DRAG_BUTTON
+ && container->details->double_clicked) {
+ if (!button_event_modifies_selection (event_button)) {
+ activate_selected_items (container);
+ } else if ((event_button->state & GDK_CONTROL_MASK) == 0 &&
+ (event_button->state & GDK_SHIFT_MASK) != 0) {
+ activate_selected_items_alternate (container, icon);
+ }
+ }
+ /* fall through */
default:
+ container->details->double_clicked = FALSE;
return FALSE;
}
}
diff --git a/libnautilus-private/nautilus-canvas-private.h b/libnautilus-private/nautilus-canvas-private.h
index 0efaa9ed8..8cf46ca8e 100644
--- a/libnautilus-private/nautilus-canvas-private.h
+++ b/libnautilus-private/nautilus-canvas-private.h
@@ -170,6 +170,7 @@ struct NautilusCanvasContainerDetails {
StretchState stretch_start;
gboolean icon_selected_on_button_down;
+ gboolean double_clicked;
NautilusCanvasIcon *double_click_icon[2]; /* Both clicks in a double click need to be on the same icon */
guint double_click_button[2];