diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index 8ce402f..54b3f3b 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -183,8 +183,8 @@ struct _GtkIconViewPrivate
   guint reorderable : 1;
   guint empty_view_drop :1;
 
-  guint ctrl_pressed : 1;
-  guint shift_pressed : 1;
+  guint modify_selection_pressed : 1;
+  guint extend_selection_pressed : 1;
 
   guint draw_focus : 1;
 };
@@ -2177,7 +2177,7 @@ gtk_icon_view_button_press (GtkWidget      *widget,
 	      gtk_icon_view_set_cursor_item (icon_view, item, cursor_cell);
 	    }
 	  else if (icon_view->priv->selection_mode == GTK_SELECTION_MULTIPLE &&
-		   (event->state & GDK_SHIFT_MASK))
+		   (event->state & GTK_EXTEND_SELECTION_MOD_MASK))
 	    {
 	      gtk_icon_view_unselect_all_internal (icon_view);
 
@@ -2194,7 +2194,7 @@ gtk_icon_view_button_press (GtkWidget      *widget,
 	    {
 	      if ((icon_view->priv->selection_mode == GTK_SELECTION_MULTIPLE ||
 		  ((icon_view->priv->selection_mode == GTK_SELECTION_SINGLE) && item->selected)) &&
-		  (event->state & GDK_CONTROL_MASK))
+		  (event->state & GTK_MODIFY_SELECTION_MOD_MASK))
 		{
 		  item->selected = !item->selected;
 		  gtk_icon_view_queue_draw_item (icon_view, item);
@@ -2239,7 +2239,7 @@ gtk_icon_view_button_press (GtkWidget      *widget,
       else
 	{
 	  if (icon_view->priv->selection_mode != GTK_SELECTION_BROWSE &&
-	      !(event->state & GDK_CONTROL_MASK))
+	      !(event->state & GTK_MODIFY_SELECTION_MOD_MASK))
 	    {
 	      dirty = gtk_icon_view_unselect_all_internal (icon_view);
 	    }
@@ -3856,10 +3856,10 @@ gtk_icon_view_real_move_cursor (GtkIconView     *icon_view,
 
   if (gtk_get_current_event_state (&state))
     {
-      if ((state & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
-        icon_view->priv->ctrl_pressed = TRUE;
-      if ((state & GDK_SHIFT_MASK) == GDK_SHIFT_MASK)
-        icon_view->priv->shift_pressed = TRUE;
+      if ((state & GTK_MODIFY_SELECTION_MOD_MASK) == GTK_MODIFY_SELECTION_MOD_MASK)
+        icon_view->priv->modify_selection_pressed = TRUE;
+      if ((state & GTK_EXTEND_SELECTION_MOD_MASK) == GTK_EXTEND_SELECTION_MOD_MASK)
+        icon_view->priv->extend_selection_pressed = TRUE;
     }
   /* else we assume not pressed */
 
@@ -3882,8 +3882,8 @@ gtk_icon_view_real_move_cursor (GtkIconView     *icon_view,
       g_assert_not_reached ();
     }
 
-  icon_view->priv->ctrl_pressed = FALSE;
-  icon_view->priv->shift_pressed = FALSE;
+  icon_view->priv->modify_selection_pressed = FALSE;
+  icon_view->priv->extend_selection_pressed = FALSE;
 
   icon_view->priv->draw_focus = TRUE;
 
@@ -4154,15 +4154,15 @@ gtk_icon_view_move_cursor_up_down (GtkIconView *icon_view,
       return;
     }
 
-  if (icon_view->priv->ctrl_pressed ||
-      !icon_view->priv->shift_pressed ||
+  if (icon_view->priv->modify_selection_pressed ||
+      !icon_view->priv->extend_selection_pressed ||
       !icon_view->priv->anchor_item ||
       icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE)
     icon_view->priv->anchor_item = item;
 
   gtk_icon_view_set_cursor_item (icon_view, item, cell);
 
-  if (!icon_view->priv->ctrl_pressed &&
+  if (!icon_view->priv->modify_selection_pressed &&
       icon_view->priv->selection_mode != GTK_SELECTION_NONE)
     {
       dirty = gtk_icon_view_unselect_all_internal (icon_view);
@@ -4209,15 +4209,15 @@ gtk_icon_view_move_cursor_page_up_down (GtkIconView *icon_view,
   if (!item)
     return;
 
-  if (icon_view->priv->ctrl_pressed ||
-      !icon_view->priv->shift_pressed ||
+  if (icon_view->priv->modify_selection_pressed ||
+      !icon_view->priv->extend_selection_pressed ||
       !icon_view->priv->anchor_item ||
       icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE)
     icon_view->priv->anchor_item = item;
 
   gtk_icon_view_set_cursor_item (icon_view, item, -1);
 
-  if (!icon_view->priv->ctrl_pressed &&
+  if (!icon_view->priv->modify_selection_pressed &&
       icon_view->priv->selection_mode != GTK_SELECTION_NONE)
     {
       dirty = gtk_icon_view_unselect_all_internal (icon_view);
@@ -4291,15 +4291,15 @@ gtk_icon_view_move_cursor_left_right (GtkIconView *icon_view,
       return;
     }
 
-  if (icon_view->priv->ctrl_pressed ||
-      !icon_view->priv->shift_pressed ||
+  if (icon_view->priv->modify_selection_pressed ||
+      !icon_view->priv->extend_selection_pressed ||
       !icon_view->priv->anchor_item ||
       icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE)
     icon_view->priv->anchor_item = item;
 
   gtk_icon_view_set_cursor_item (icon_view, item, cell);
 
-  if (!icon_view->priv->ctrl_pressed &&
+  if (!icon_view->priv->modify_selection_pressed &&
       icon_view->priv->selection_mode != GTK_SELECTION_NONE)
     {
       dirty = gtk_icon_view_unselect_all_internal (icon_view);
@@ -4338,15 +4338,15 @@ gtk_icon_view_move_cursor_start_end (GtkIconView *icon_view,
   if (!item)
     return;
 
-  if (icon_view->priv->ctrl_pressed ||
-      !icon_view->priv->shift_pressed ||
+  if (icon_view->priv->modify_selection_pressed ||
+      !icon_view->priv->extend_selection_pressed ||
       !icon_view->priv->anchor_item ||
       icon_view->priv->selection_mode != GTK_SELECTION_MULTIPLE)
     icon_view->priv->anchor_item = item;
 
   gtk_icon_view_set_cursor_item (icon_view, item, -1);
 
-  if (!icon_view->priv->ctrl_pressed &&
+  if (!icon_view->priv->modify_selection_pressed &&
       icon_view->priv->selection_mode != GTK_SELECTION_NONE)
     {
       dirty = gtk_icon_view_unselect_all_internal (icon_view);
diff --git a/gtk/gtkprivate.h b/gtk/gtkprivate.h
index 9e1feb9..8a80490 100644
--- a/gtk/gtkprivate.h
+++ b/gtk/gtkprivate.h
@@ -122,6 +122,14 @@ gboolean _gtk_fnmatch (const char *pattern,
 #define GTK_NO_TEXT_INPUT_MOD_MASK (GDK_MOD2_MASK | GDK_CONTROL_MASK)
 #endif
 
+#ifndef GDK_WINDOWING_QUARTZ
+#define GTK_EXTEND_SELECTION_MOD_MASK GDK_SHIFT_MASK
+#define GTK_MODIFY_SELECTION_MOD_MASK GDK_CONTROL_MASK
+#else
+#define GTK_EXTEND_SELECTION_MOD_MASK GDK_SHIFT_MASK
+#define GTK_MODIFY_SELECTION_MOD_MASK GDK_MOD2_MASK
+#endif
+
 G_END_DECLS
 
 #endif /* __GTK_PRIVATE_H__ */
