summaryrefslogtreecommitdiff
path: root/gtk/gtkmenubar.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk/gtkmenubar.c')
-rw-r--r--gtk/gtkmenubar.c45
1 files changed, 35 insertions, 10 deletions
diff --git a/gtk/gtkmenubar.c b/gtk/gtkmenubar.c
index 30417a1b05..50bb4eecc1 100644
--- a/gtk/gtkmenubar.c
+++ b/gtk/gtkmenubar.c
@@ -33,7 +33,8 @@ static void gtk_menu_bar_size_request (GtkWidget *widget,
GtkRequisition *requisition);
static void gtk_menu_bar_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
-static void gtk_menu_bar_paint (GtkWidget *widget);
+static void gtk_menu_bar_paint (GtkWidget *widget,
+ GdkRectangle *area);
static void gtk_menu_bar_draw (GtkWidget *widget,
GdkRectangle *area);
static gint gtk_menu_bar_expose (GtkWidget *widget,
@@ -262,10 +263,21 @@ gtk_menu_bar_size_allocate (GtkWidget *widget,
}
static void
-gtk_menu_bar_paint (GtkWidget *widget)
+gtk_menu_bar_paint (GtkWidget *widget, GdkRectangle *area)
{
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_MENU_BAR (widget));
+
+ if (GTK_WIDGET_DRAWABLE (widget))
+ {
+ gtk_paint_box (widget->style,
+ widget->window,
+ GTK_STATE_NORMAL,
+ GTK_SHADOW_OUT,
+ area, widget, "menubar",
+ 0, 0,
+ -1,-1);
+ }
}
static void
@@ -283,13 +295,7 @@ gtk_menu_bar_draw (GtkWidget *widget,
if (GTK_WIDGET_DRAWABLE (widget))
{
- gtk_paint_box (widget->style,
- widget->window,
- GTK_STATE_NORMAL,
- GTK_SHADOW_OUT,
- area, widget, "menubar",
- 0, 0,
- -1,-1);
+ gtk_menu_bar_paint (widget, area);
menu_shell = GTK_MENU_SHELL (widget);
@@ -309,13 +315,32 @@ static gint
gtk_menu_bar_expose (GtkWidget *widget,
GdkEventExpose *event)
{
+ GtkMenuShell *menu_shell;
+ GdkEventExpose child_event;
+ GList *children;
+ GtkWidget *child;
+
g_return_val_if_fail (widget != NULL, FALSE);
g_return_val_if_fail (GTK_IS_MENU_BAR (widget), FALSE);
g_return_val_if_fail (event != NULL, FALSE);
if (GTK_WIDGET_DRAWABLE (widget))
{
- gtk_menu_bar_draw(widget, &event->area);
+ gtk_menu_bar_paint (widget, &event->area);
+
+ menu_shell = GTK_MENU_SHELL (widget);
+ child_event = *event;
+
+ children = menu_shell->children;
+ while (children)
+ {
+ child = children->data;
+ children = children->next;
+
+ if (GTK_WIDGET_NO_WINDOW (child) &&
+ gtk_widget_intersect (child, &event->area, &child_event.area))
+ gtk_widget_event (child, (GdkEvent*) &child_event);
+ }
}
return FALSE;