diff -r c12d732c2c7e gladeui/glade-accumulators.c
--- a/gladeui/glade-accumulators.c	Wed Aug 20 23:27:10 2008 +0300
+++ b/gladeui/glade-accumulators.c	Thu Aug 21 01:10:41 2008 +0300
@@ -40,6 +40,22 @@
 	g_value_set_object (return_accu, object);
 	
 	return (object == NULL);
+}
+
+gboolean
+glade_integer_handled_accumulator (GSignalInvocationHint *ihint,
+				   GValue                *return_accu,
+				   const GValue          *handler_return,
+				   gpointer               dummy)
+{
+	gboolean continue_emission;
+	gint retval;
+	
+	retval = g_value_get_int (handler_return);
+	g_value_set_int (return_accu, retval >> 1);
+	continue_emission = !(retval & 1);
+	
+	return continue_emission;
 }
 
 /* From gtkmain.c */
diff -r c12d732c2c7e gladeui/glade-accumulators.h
--- a/gladeui/glade-accumulators.h	Wed Aug 20 23:27:10 2008 +0300
+++ b/gladeui/glade-accumulators.h	Thu Aug 21 01:10:41 2008 +0300
@@ -7,6 +7,11 @@
 G_BEGIN_DECLS
 
 gboolean glade_single_object_accumulator   (GSignalInvocationHint *ihint,
+					    GValue                *return_accu,
+					    const GValue          *handler_return,
+					    gpointer               dummy);
+
+gboolean glade_integer_handled_accumulator (GSignalInvocationHint *ihint,
 					    GValue                *return_accu,
 					    const GValue          *handler_return,
 					    gpointer               dummy);
diff -r c12d732c2c7e gladeui/glade-design-layout.c
--- a/gladeui/glade-design-layout.c	Wed Aug 20 23:27:10 2008 +0300
+++ b/gladeui/glade-design-layout.c	Thu Aug 21 01:10:41 2008 +0300
@@ -27,6 +27,8 @@
 
 #include "glade.h"
 #include "glade-design-layout.h"
+#include "glade-accumulators.h"
+#include "glade-marshallers.h"
 
 #include <gtk/gtk.h>
 
@@ -56,6 +58,12 @@
 	REGION_OUTSIDE
 } PointerRegion;
 
+enum
+{
+	WIDGET_EVENT,
+	LAST_SIGNAL
+};
+
 struct _GladeDesignLayoutPrivate
 {
 	GdkWindow *event_window;
@@ -72,6 +80,8 @@
 	gint new_width;             /* user's new requested width */
 	gint new_height;            /* user's new requested height */
 };
+
+static guint              glade_design_layout_signals[LAST_SIGNAL] = {0};
 
 G_DEFINE_TYPE (GladeDesignLayout, glade_design_layout, GTK_TYPE_BIN)
 
@@ -837,13 +847,27 @@
 	/* Then we try a GladeWidget */
 	if (gwidget) 
 	{
-		retval = glade_widget_event (gwidget, event);
+		g_signal_emit_by_name (layout, "widget-event",
+				       event, gwidget, &retval);
 
 		if (retval)
 			return retval;
 	}
 
 	return FALSE;
+}
+
+static gboolean
+glade_design_layout_widget_event_impl (GladeProject *project,
+				       GdkEvent *event,
+				       GladeWidget *gwidget)
+{
+
+	if (glade_widget_event (gwidget, event))
+		return GLADE_WIDGET_EVENT_STOP_EMISSION |
+			GLADE_WIDGET_EVENT_RETURN_TRUE;
+	else
+		return 0;
 }
 
 static void
@@ -897,6 +921,20 @@
 	widget_class->size_request          = glade_design_layout_size_request;
 	widget_class->size_allocate         = glade_design_layout_size_allocate;
 
+	klass->widget_event          = glade_design_layout_widget_event_impl;
+
+	glade_design_layout_signals[WIDGET_EVENT] =
+		g_signal_new ("widget-event",
+			      G_TYPE_FROM_CLASS (object_class),
+			      G_SIGNAL_RUN_LAST,
+			      G_STRUCT_OFFSET (GladeDesignLayoutClass, widget_event),
+			      glade_integer_handled_accumulator, NULL,
+			      glade_marshal_INT__BOXED_OBJECT,
+			      G_TYPE_INT,
+			      2,
+			      GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE,
+			      GLADE_TYPE_WIDGET);
+
 	g_type_class_add_private (object_class, sizeof (GladeDesignLayoutPrivate));
 }
 
diff -r c12d732c2c7e gladeui/glade-design-layout.h
--- a/gladeui/glade-design-layout.h	Wed Aug 20 23:27:10 2008 +0300
+++ b/gladeui/glade-design-layout.h	Thu Aug 21 01:10:41 2008 +0300
@@ -40,6 +40,12 @@
 typedef struct _GladeDesignLayoutPrivate  GladeDesignLayoutPrivate;
 typedef struct _GladeDesignLayoutClass    GladeDesignLayoutClass;
 
+enum
+{
+	GLADE_WIDGET_EVENT_STOP_EMISSION   = 1 << 0,
+	GLADE_WIDGET_EVENT_RETURN_TRUE     = 1 << 1
+};
+
 struct _GladeDesignLayout
 {
 	GtkBin parent_instance;
@@ -50,6 +56,9 @@
 struct _GladeDesignLayoutClass
 {
 	GtkBinClass parent_class;
+	gboolean      (*widget_event)        (GladeProject *project,
+					      GdkEvent *event,
+					      GladeWidget *gwidget);
 
 };
 
diff -r c12d732c2c7e gladeui/glade-marshallers.list
--- a/gladeui/glade-marshallers.list	Wed Aug 20 23:27:10 2008 +0300
+++ b/gladeui/glade-marshallers.list	Thu Aug 21 01:10:41 2008 +0300
@@ -1,19 +1,15 @@
 VOID:POINTER,POINTER
-VOID:STRING,ULONG,UINT,STRING
 VOID:OBJECT
 VOID:OBJECT,BOOLEAN
 VOID:STRING,STRING,STRING
 OBJECT:POINTER
 OBJECT:OBJECT,UINT
-BOOLEAN:STRING
 BOOLEAN:BOXED
 BOOLEAN:OBJECT
-BOOLEAN:OBJECT,BOXED
 BOOLEAN:OBJECT,POINTER
-BOOLEAN:OBJECT,BOOLEAN
 BOOLEAN:OBJECT,UINT
 BOOLEAN:OBJECT,OBJECT
-BOOLEAN:OBJECT,STRING
 STRING:OBJECT
 BOOLEAN:STRING,STRING,STRING,BOXED
 BOOLEAN:STRING,BOXED,OBJECT
+INT:BOXED,OBJECT
diff -r c12d732c2c7e gladeui/glade-project.h
--- a/gladeui/glade-project.h	Wed Aug 20 23:27:10 2008 +0300
+++ b/gladeui/glade-project.h	Thu Aug 21 01:10:41 2008 +0300
@@ -70,6 +70,9 @@
 	void          (*resource_removed)    (GladeProject *project,
 					      const gchar  *resource);
 	void          (*parse_finished)      (GladeProject *project);
+	gboolean      (*widget_event)        (GladeProject *project,
+					      GdkEvent *event,
+					      GladeWidget *gwidget);
 };
 
 
