Index: gdk/gdkevents.c
===================================================================
--- gdk/gdkevents.c	(revision 17786)
+++ gdk/gdkevents.c	(working copy)
@@ -361,10 +361,6 @@
   new_event = gdk_event_new (GDK_NOTHING);
   new_private = (GdkEventPrivate *)new_event;
 
-  *new_event = *event;
-  if (new_event->any.window)
-    g_object_ref (new_event->any.window);
-
   if (gdk_event_is_allocated (event))
     {
       GdkEventPrivate *private = (GdkEventPrivate *)event;
@@ -374,13 +370,24 @@
   
   switch (event->any.type)
     {
+    case GDK_CLIENT_EVENT:
+      new_event->client = event->client;
+      break;
+
+    case GDK_CONFIGURE:
+      new_event->configure = event->configure;
+      break;
+
     case GDK_KEY_PRESS:
     case GDK_KEY_RELEASE:
+      new_event->key = event->key;
       new_event->key.string = g_strdup (event->key.string);
       break;
       
     case GDK_ENTER_NOTIFY:
     case GDK_LEAVE_NOTIFY:
+      new_event->crossing = event->crossing;
+
       if (event->crossing.subwindow != NULL)
 	g_object_ref (event->crossing.subwindow);
       break;
@@ -391,36 +398,100 @@
     case GDK_DRAG_STATUS:
     case GDK_DROP_START:
     case GDK_DROP_FINISHED:
+      new_event->dnd = event->dnd;
       g_object_ref (event->dnd.context);
       break;
       
     case GDK_EXPOSE:
+      new_event->expose = event->expose;
+
       if (event->expose.region)
 	new_event->expose.region = gdk_region_copy (event->expose.region);
       break;
-      
+
+    case GDK_FOCUS_CHANGE:
+      new_event->focus_change = event->focus_change;
+      break;
+
+    case GDK_GRAB_BROKEN:
+      new_event->grab_broken = event->grab_broken;
+      break;
+
+    case GDK_NO_EXPOSE:
+      new_event->no_expose = event->no_expose;
+      break;
+
     case GDK_SETTING:
+      new_event->setting = event->setting;
       new_event->setting.name = g_strdup (new_event->setting.name);
       break;
 
     case GDK_BUTTON_PRESS:
     case GDK_BUTTON_RELEASE:
-      if (event->button.axes) 
-	new_event->button.axes = g_memdup (event->button.axes, 
+      new_event->button = event->button;
+
+	  if (event->any.type == GDK_BUTTON_PRESS || event->any.type == GDK_BUTTON_RELEASE)
+		  	new_event->button.axes = g_memdup (event->button.axes, 
 					     sizeof (gdouble) * event->button.device->num_axes);
       break;
 
+    case GDK_2BUTTON_PRESS:
+    case GDK_3BUTTON_PRESS:
+	  new_event->button = event->button;
+      break;
+
     case GDK_MOTION_NOTIFY:
+      new_event->motion = event->motion;
+
       if (event->motion.axes) 
 	new_event->motion.axes = g_memdup (event->motion.axes, 
 					   sizeof (gdouble) * event->motion.device->num_axes);
       
       break;
-      
-    default:
+
+    case GDK_OWNER_CHANGE:
+      new_event->owner_change = event->owner_change;
       break;
+
+    case GDK_PROPERTY_NOTIFY:
+      new_event->property = event->property;
+      break;
+
+    case GDK_PROXIMITY_IN:
+    case GDK_PROXIMITY_OUT:
+      new_event->proximity = event->proximity;
+      break;
+
+    case GDK_SCROLL:
+      new_event->scroll = event->scroll;
+      break;
+
+    case GDK_SELECTION_CLEAR:
+    case GDK_SELECTION_REQUEST:
+    case GDK_SELECTION_NOTIFY:
+      new_event->selection = event->selection;
+      break;
+
+    case GDK_VISIBILITY_NOTIFY:
+      new_event->visibility = event->visibility;
+      break;
+
+    case GDK_WINDOW_STATE:
+      new_event->window_state = event->window_state;
+      break;
+
+    case GDK_NOTHING:
+    case GDK_DELETE:
+    case GDK_DESTROY:
+    case GDK_MAP:
+    case GDK_UNMAP:
+      new_event->any = event->any;
+      break;
     }
   
+  if (new_event->any.window)
+    g_object_ref (new_event->any.window);
+
   return new_event;
 }
 
