diff -rupN --no-dereference gtk+-2.24.33/gtk/gtkmenushell.c gtk+-2.24.33-new/gtk/gtkmenushell.c
--- gtk+-2.24.33/gtk/gtkmenushell.c 2020-12-18 06:29:40.000000000 +0100
+++ gtk+-2.24.33-new/gtk/gtkmenushell.c 2021-01-05 15:57:58.443717047 +0100
@@ -609,18 +609,45 @@ gtk_menu_shell_button_press (GtkWidget
if (!menu_shell->active || !menu_shell->button)
{
- gtk_menu_shell_activate (menu_shell);
+ gboolean initially_active = menu_shell->active;
menu_shell->button = event->button;
- if (menu_item && _gtk_menu_item_is_selectable (menu_item) &&
- menu_item->parent == widget &&
- menu_item != menu_shell->active_menu_item)
+ if (menu_item)
{
- if (GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement == GTK_TOP_BOTTOM)
+ if (_gtk_menu_item_is_selectable (menu_item) &&
+ menu_item->parent == widget &&
+ menu_item != menu_shell->active_menu_item)
{
- menu_shell->activate_time = event->time;
- gtk_menu_shell_select_item (menu_shell, menu_item);
+ gtk_menu_shell_activate (menu_shell);
+ menu_shell->button = event->button;
+
+ if (GTK_MENU_SHELL_GET_CLASS (menu_shell)->submenu_placement == GTK_TOP_BOTTOM)
+ {
+ menu_shell->activate_time = event->time;
+ gtk_menu_shell_select_item (menu_shell, menu_item);
+ }
+ }
+ }
+ else
+ {
+ if (!initially_active)
+ {
+ gboolean window_drag = FALSE;
+
+ gtk_widget_style_get (widget,
+ "window-dragging", &window_drag,
+ NULL);
+
+ if (window_drag)
+ {
+ gtk_menu_shell_deactivate (menu_shell);
+ gtk_window_begin_move_drag (GTK_WINDOW (gtk_widget_get_toplevel (widget)),
+ event->button,
+ event->x_root,
+ event->y_root,
+ event->time);
+ }
}
}
}
diff -rupN --no-dereference gtk+-2.24.33/gtk/gtktoolbar.c gtk+-2.24.33-new/gtk/gtktoolbar.c
--- gtk+-2.24.33/gtk/gtktoolbar.c 2020-12-18 06:29:40.000000000 +0100
+++ gtk+-2.24.33-new/gtk/gtktoolbar.c 2021-01-05 15:57:58.444717039 +0100
@@ -2701,6 +2701,8 @@ static gboolean
gtk_toolbar_button_press (GtkWidget *toolbar,
GdkEventButton *event)
{
+ GtkWidget *window;
+
if (_gtk_button_event_triggers_context_menu (event))
{
gboolean return_value;
@@ -2711,7 +2713,29 @@ gtk_toolbar_button_press (GtkWidget
return return_value;
}
-
+
+ window = gtk_widget_get_toplevel (toolbar);
+
+ if (window)
+ {
+ gboolean window_drag = FALSE;
+
+ gtk_widget_style_get (toolbar,
+ "window-dragging", &window_drag,
+ NULL);
+
+ if (window_drag)
+ {
+ gtk_window_begin_move_drag (GTK_WINDOW (window),
+ event->button,
+ event->x_root,
+ event->y_root,
+ event->time);
+
+ return TRUE;
+ }
+ }
+
return FALSE;
}
diff -rupN --no-dereference gtk+-2.24.33/gtk/gtkwidget.c gtk+-2.24.33-new/gtk/gtkwidget.c
--- gtk+-2.24.33/gtk/gtkwidget.c 2020-12-18 06:29:40.000000000 +0100
+++ gtk+-2.24.33-new/gtk/gtkwidget.c 2021-01-05 15:57:58.445717030 +0100
@@ -2467,6 +2467,13 @@ gtk_widget_class_init (GtkWidgetClass *k
0.0, 1.0, 0.04,
GTK_PARAM_READABLE));
+ gtk_widget_class_install_style_property (klass,
+ g_param_spec_boolean ("window-dragging",
+ P_("Window dragging"),
+ P_("Window dragging"),
+ FALSE,
+ GTK_PARAM_READWRITE));
+
/**
* GtkWidget:draw-border:
*