menu: Don't set widget->window

Instead, create an input window for the menubar and omit the window for
the menu itself.
This commit is contained in:
Benjamin Otte 2016-11-02 17:50:12 +01:00
parent 633a93f418
commit bb8b24da47
3 changed files with 54 additions and 55 deletions

View File

@ -2598,37 +2598,24 @@ gtk_menu_realize (GtkWidget *widget)
GtkMenu *menu = GTK_MENU (widget); GtkMenu *menu = GTK_MENU (widget);
GtkMenuPrivate *priv = menu->priv; GtkMenuPrivate *priv = menu->priv;
GtkAllocation allocation; GtkAllocation allocation;
GdkWindow *window;
GtkWidget *child; GtkWidget *child;
GList *children; GList *children;
GtkBorder arrow_border, padding; GtkBorder arrow_border, padding;
g_return_if_fail (GTK_IS_MENU (widget)); GTK_WIDGET_CLASS (gtk_menu_parent_class)->realize (widget);
gtk_widget_set_realized (widget, TRUE);
gtk_widget_get_allocation (widget, &allocation); gtk_widget_get_allocation (widget, &allocation);
window = gdk_window_new_child (gtk_widget_get_parent_window (widget),
gtk_widget_get_events (widget)
| GDK_KEY_PRESS_MASK
| GDK_ENTER_NOTIFY_MASK
| GDK_LEAVE_NOTIFY_MASK,
&allocation);
gtk_widget_set_window (widget, window);
gtk_widget_register_window (widget, window);
get_menu_padding (widget, &padding); get_menu_padding (widget, &padding);
get_arrows_border (menu, &arrow_border); get_arrows_border (menu, &arrow_border);
priv->view_window = gdk_window_new_child (window, priv->view_window = gdk_window_new_child (gtk_widget_get_window (widget),
gtk_widget_get_events (widget) gtk_widget_get_events (widget)
| GDK_KEY_PRESS_MASK | GDK_KEY_PRESS_MASK
| GDK_ENTER_NOTIFY_MASK | GDK_ENTER_NOTIFY_MASK
| GDK_LEAVE_NOTIFY_MASK, | GDK_LEAVE_NOTIFY_MASK,
&(GdkRectangle) { &(GdkRectangle) {
padding.left, allocation.x + padding.left,
padding.top + arrow_border.top, allocation.y + padding.top + arrow_border.top,
MAX (1, allocation.width - padding.left - padding.right), MAX (1, allocation.width - padding.left - padding.right),
MAX (1, allocation.height - padding.top - padding.bottom MAX (1, allocation.height - padding.top - padding.bottom
- arrow_border.top - arrow_border.bottom)}); - arrow_border.top - arrow_border.bottom)});
@ -2853,8 +2840,8 @@ gtk_menu_size_allocate (GtkWidget *widget,
for (i = 0; i < priv->heights_length; i++) for (i = 0; i < priv->heights_length; i++)
priv->requested_height += priv->heights[i]; priv->requested_height += priv->heights[i];
x = padding.left; x = allocation->x + padding.left;
y = padding.top; y = allocation->y + padding.top;
width = allocation->width - padding.left - padding.right; width = allocation->width - padding.left - padding.right;
height = allocation->height - padding.top - padding.bottom; height = allocation->height - padding.top - padding.bottom;
@ -2886,10 +2873,6 @@ gtk_menu_size_allocate (GtkWidget *widget,
if (gtk_widget_get_realized (widget)) if (gtk_widget_get_realized (widget))
{ {
gdk_window_move_resize (gtk_widget_get_window (widget),
allocation->x, allocation->y,
allocation->width, allocation->height);
gdk_window_move_resize (priv->view_window, x, y, width, height); gdk_window_move_resize (priv->view_window, x, y, width, height);
} }

View File

@ -72,6 +72,7 @@ struct _GtkMenuBarPrivate
GtkPackDirection pack_direction; GtkPackDirection pack_direction;
GtkPackDirection child_pack_direction; GtkPackDirection child_pack_direction;
GdkWindow *input_window;
GtkCssGadget *gadget; GtkCssGadget *gadget;
}; };
@ -96,6 +97,8 @@ static void gtk_menu_bar_size_allocate (GtkWidget *widget,
GtkAllocation *allocation); GtkAllocation *allocation);
static gint gtk_menu_bar_draw (GtkWidget *widget, static gint gtk_menu_bar_draw (GtkWidget *widget,
cairo_t *cr); cairo_t *cr);
static void gtk_menu_bar_realize (GtkWidget *widget);
static void gtk_menu_bar_unrealize (GtkWidget *widget);
static void gtk_menu_bar_hierarchy_changed (GtkWidget *widget, static void gtk_menu_bar_hierarchy_changed (GtkWidget *widget,
GtkWidget *old_toplevel); GtkWidget *old_toplevel);
static gint gtk_menu_bar_get_popup_delay (GtkMenuShell *menu_shell); static gint gtk_menu_bar_get_popup_delay (GtkMenuShell *menu_shell);
@ -144,7 +147,11 @@ gtk_menu_bar_class_init (GtkMenuBarClass *class)
widget_class->measure = gtk_menu_bar_measure_; widget_class->measure = gtk_menu_bar_measure_;
widget_class->size_allocate = gtk_menu_bar_size_allocate; widget_class->size_allocate = gtk_menu_bar_size_allocate;
widget_class->size_allocate = gtk_menu_bar_size_allocate;
widget_class->size_allocate = gtk_menu_bar_size_allocate;
widget_class->draw = gtk_menu_bar_draw; widget_class->draw = gtk_menu_bar_draw;
widget_class->realize = gtk_menu_bar_realize;
widget_class->unrealize = gtk_menu_bar_unrealize;
widget_class->hierarchy_changed = gtk_menu_bar_hierarchy_changed; widget_class->hierarchy_changed = gtk_menu_bar_hierarchy_changed;
menu_shell_class->submenu_placement = GTK_TOP_BOTTOM; menu_shell_class->submenu_placement = GTK_TOP_BOTTOM;
@ -317,6 +324,42 @@ gtk_menu_bar_get_property (GObject *object,
} }
} }
static void
gtk_menu_bar_realize (GtkWidget *widget)
{
GtkMenuBar *menubar = GTK_MENU_BAR (widget);
GtkMenuBarPrivate *priv = menubar->priv;
GtkAllocation allocation;
GTK_WIDGET_CLASS (gtk_menu_bar_parent_class)->realize (widget);
gtk_widget_get_allocation (widget, &allocation);
priv->input_window = gdk_window_new_input (gtk_widget_get_window (widget),
gtk_widget_get_events (widget)
| GDK_BUTTON_PRESS_MASK
| GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK
| GDK_KEY_PRESS_MASK
| GDK_ENTER_NOTIFY_MASK
| GDK_LEAVE_NOTIFY_MASK,
&allocation);
gtk_widget_register_window (widget, priv->input_window);
}
static void
gtk_menu_bar_unrealize (GtkWidget *widget)
{
GtkMenuBar *menubar = GTK_MENU_BAR (widget);
GtkMenuBarPrivate *priv = menubar->priv;
gtk_widget_unregister_window (widget, priv->input_window);
gdk_window_destroy (priv->input_window);
priv->input_window = NULL;
GTK_WIDGET_CLASS (gtk_menu_bar_parent_class)->unrealize (widget);
}
static void static void
gtk_menu_bar_measure (GtkCssGadget *gadget, gtk_menu_bar_measure (GtkCssGadget *gadget,
GtkOrientation orientation, GtkOrientation orientation,
@ -556,20 +599,18 @@ static void
gtk_menu_bar_size_allocate (GtkWidget *widget, gtk_menu_bar_size_allocate (GtkWidget *widget,
GtkAllocation *allocation) GtkAllocation *allocation)
{ {
GtkMenuBar *menu_bar; GtkMenuBar *menu_bar = GTK_MENU_BAR (widget);
GtkMenuBarPrivate *priv = menu_bar->priv;
GtkAllocation clip, content_allocation; GtkAllocation clip, content_allocation;
menu_bar = GTK_MENU_BAR (widget);
gtk_widget_set_allocation (widget, allocation); gtk_widget_set_allocation (widget, allocation);
if (gtk_widget_get_realized (widget)) if (gtk_widget_get_realized (widget))
gdk_window_move_resize (gtk_widget_get_window (widget), gdk_window_move_resize (priv->input_window,
allocation->x, allocation->y, allocation->x, allocation->y,
allocation->width, allocation->height); allocation->width, allocation->height);
content_allocation = *allocation; content_allocation = *allocation;
content_allocation.x = content_allocation.y = 0; gtk_css_gadget_allocate (priv->gadget,
gtk_css_gadget_allocate (menu_bar->priv->gadget,
&content_allocation, &content_allocation,
gtk_widget_get_allocated_baseline (widget), gtk_widget_get_allocated_baseline (widget),
&clip); &clip);

View File

@ -115,7 +115,6 @@ static void gtk_menu_shell_get_property (GObject *object,
guint prop_id, guint prop_id,
GValue *value, GValue *value,
GParamSpec *pspec); GParamSpec *pspec);
static void gtk_menu_shell_realize (GtkWidget *widget);
static void gtk_menu_shell_finalize (GObject *object); static void gtk_menu_shell_finalize (GObject *object);
static void gtk_menu_shell_dispose (GObject *object); static void gtk_menu_shell_dispose (GObject *object);
static gint gtk_menu_shell_button_press (GtkWidget *widget, static gint gtk_menu_shell_button_press (GtkWidget *widget,
@ -189,7 +188,6 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass)
object_class->finalize = gtk_menu_shell_finalize; object_class->finalize = gtk_menu_shell_finalize;
object_class->dispose = gtk_menu_shell_dispose; object_class->dispose = gtk_menu_shell_dispose;
widget_class->realize = gtk_menu_shell_realize;
widget_class->button_press_event = gtk_menu_shell_button_press; widget_class->button_press_event = gtk_menu_shell_button_press;
widget_class->button_release_event = gtk_menu_shell_button_release; widget_class->button_release_event = gtk_menu_shell_button_release;
widget_class->grab_broken_event = gtk_menu_shell_grab_broken; widget_class->grab_broken_event = gtk_menu_shell_grab_broken;
@ -434,7 +432,7 @@ gtk_menu_shell_init (GtkMenuShell *menu_shell)
menu_shell->priv = gtk_menu_shell_get_instance_private (menu_shell); menu_shell->priv = gtk_menu_shell_get_instance_private (menu_shell);
menu_shell->priv->take_focus = TRUE; menu_shell->priv->take_focus = TRUE;
gtk_widget_set_has_window (GTK_WIDGET (menu_shell), TRUE); gtk_widget_set_has_window (GTK_WIDGET (menu_shell), FALSE);
} }
static void static void
@ -582,29 +580,6 @@ gtk_menu_shell_deactivate (GtkMenuShell *menu_shell)
g_signal_emit (menu_shell, menu_shell_signals[DEACTIVATE], 0); g_signal_emit (menu_shell, menu_shell_signals[DEACTIVATE], 0);
} }
static void
gtk_menu_shell_realize (GtkWidget *widget)
{
GtkAllocation allocation;
GdkWindow *window;
gtk_widget_set_realized (widget, TRUE);
gtk_widget_get_allocation (widget, &allocation);
window = gdk_window_new_child (gtk_widget_get_parent_window (widget),
gtk_widget_get_events (widget)
| GDK_BUTTON_PRESS_MASK
| GDK_BUTTON_RELEASE_MASK
| GDK_POINTER_MOTION_MASK
| GDK_KEY_PRESS_MASK
| GDK_ENTER_NOTIFY_MASK
| GDK_LEAVE_NOTIFY_MASK,
&allocation);
gtk_widget_set_window (widget, window);
gtk_widget_register_window (widget, window);
}
static void static void
gtk_menu_shell_activate (GtkMenuShell *menu_shell) gtk_menu_shell_activate (GtkMenuShell *menu_shell)
{ {