summaryrefslogtreecommitdiff
path: root/gtk/gtkdnd.c
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2010-12-22 21:46:23 -0500
committerMatthias Clasen <mclasen@redhat.com>2010-12-22 21:47:14 -0500
commit7e0a30b752a2a53d8e0ac2332e5f0ed99c6aafcf (patch)
tree1e59356576f87b6f798beafcfaaacaaeab2eccc7 /gtk/gtkdnd.c
parent9baf24f87e504363e8b313f2ec02d84f13c5e262 (diff)
downloadgtk+-7e0a30b752a2a53d8e0ac2332e5f0ed99c6aafcf.tar.gz
Abort a drag when a keynav drop has not destination
This was claimed to cause problems for Chromium, see bug 599130. Also work around apparent rounding errors in XIWarpDevice by setting the 'small step' for keynav dnd to 2 instead of 1 - I notice that a warp seems to sometimes warp a little less than I tell it to, and if I tell it to only move by 1 pixel then moving less means that you are stuck.
Diffstat (limited to 'gtk/gtkdnd.c')
-rw-r--r--gtk/gtkdnd.c76
1 files changed, 42 insertions, 34 deletions
diff --git a/gtk/gtkdnd.c b/gtk/gtkdnd.c
index 8efbacd39f..d0c2301798 100644
--- a/gtk/gtkdnd.c
+++ b/gtk/gtkdnd.c
@@ -4184,7 +4184,7 @@ gtk_drag_motion_cb (GtkWidget *widget,
*************************************************************/
#define BIG_STEP 20
-#define SMALL_STEP 1
+#define SMALL_STEP 2
static gboolean
gtk_drag_key_cb (GtkWidget *widget,
@@ -4204,41 +4204,49 @@ gtk_drag_key_cb (GtkWidget *widget,
if (event->type == GDK_KEY_PRESS)
{
switch (event->keyval)
- {
- case GDK_KEY_Escape:
- gtk_drag_cancel (info, GTK_DRAG_RESULT_USER_CANCELLED, event->time);
- return TRUE;
+{
+ case GDK_KEY_Escape:
+ gtk_drag_cancel (info, GTK_DRAG_RESULT_USER_CANCELLED, event->time);
+ return TRUE;
- case GDK_KEY_space:
- case GDK_KEY_Return:
+ case GDK_KEY_space:
+ case GDK_KEY_Return:
case GDK_KEY_ISO_Enter:
- case GDK_KEY_KP_Enter:
- case GDK_KEY_KP_Space:
- gtk_drag_end (info, event->time);
- gtk_drag_drop (info, event->time);
- return TRUE;
-
- case GDK_KEY_Up:
- case GDK_KEY_KP_Up:
- dy = (state & GDK_MOD1_MASK) ? -BIG_STEP : -SMALL_STEP;
- break;
-
- case GDK_KEY_Down:
- case GDK_KEY_KP_Down:
- dy = (state & GDK_MOD1_MASK) ? BIG_STEP : SMALL_STEP;
- break;
-
- case GDK_KEY_Left:
- case GDK_KEY_KP_Left:
- dx = (state & GDK_MOD1_MASK) ? -BIG_STEP : -SMALL_STEP;
- break;
-
- case GDK_KEY_Right:
- case GDK_KEY_KP_Right:
- dx = (state & GDK_MOD1_MASK) ? BIG_STEP : SMALL_STEP;
- break;
- }
-
+ case GDK_KEY_KP_Enter:
+ case GDK_KEY_KP_Space:
+ if ((gdk_drag_context_get_selected_action (info->context) != 0) &&
+ (gdk_drag_context_get_dest_window (info->context) != NULL))
+ {
+ gtk_drag_end (info, event->time);
+ gtk_drag_drop (info, event->time);
+ }
+ else
+ {
+ gtk_drag_cancel (info, GTK_DRAG_RESULT_NO_TARGET, event->time);
+ }
+
+ return TRUE;
+
+ case GDK_KEY_Up:
+ case GDK_KEY_KP_Up:
+ dy = (state & GDK_MOD1_MASK) ? -BIG_STEP : -SMALL_STEP;
+ break;
+
+ case GDK_KEY_Down:
+ case GDK_KEY_KP_Down:
+ dy = (state & GDK_MOD1_MASK) ? BIG_STEP : SMALL_STEP;
+ break;
+
+ case GDK_KEY_Left:
+ case GDK_KEY_KP_Left:
+ dx = (state & GDK_MOD1_MASK) ? -BIG_STEP : -SMALL_STEP;
+ break;
+
+ case GDK_KEY_Right:
+ case GDK_KEY_KP_Right:
+ dx = (state & GDK_MOD1_MASK) ? BIG_STEP : SMALL_STEP;
+ break;
+ }
}
/* Now send a "motion" so that the modifier state is updated */