Bug 732160 - menu activation with alt-somekey makes tools stay...
...in "alt-pressed" mode Menu activation doesn't cause a focus-out becaus menu keyboard grabbing is implemented with a simple gtk_grab_add() (the menu popup never gets the focus). Therefore, the canvas never gets a focus-out event and the pressed modifiers are stuck. Fixed by connecting to "grab-notify" on the canvas, and artificially releasing all modifiers when the canvas is shadowed by a grab.
This commit is contained in:
@ -649,7 +649,7 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas,
|
|||||||
|
|
||||||
active_tool = tool_manager_get_active (gimp);
|
active_tool = tool_manager_get_active (gimp);
|
||||||
|
|
||||||
state &= ~gimp_display_shell_key_to_state (bevent->button);
|
state &= ~gimp_display_shell_button_to_state (bevent->button);
|
||||||
|
|
||||||
if (bevent->button == 1)
|
if (bevent->button == 1)
|
||||||
{
|
{
|
||||||
@ -1233,6 +1233,36 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas,
|
|||||||
return return_val;
|
return return_val;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
gimp_display_shell_canvas_grab_notify (GtkWidget *canvas,
|
||||||
|
gboolean was_grabbed,
|
||||||
|
GimpDisplayShell *shell)
|
||||||
|
{
|
||||||
|
GimpDisplay *display;
|
||||||
|
GimpImage *image;
|
||||||
|
Gimp *gimp;
|
||||||
|
|
||||||
|
/* are we in destruction? */
|
||||||
|
if (! shell->display || ! gimp_display_get_shell (shell->display))
|
||||||
|
return;
|
||||||
|
|
||||||
|
display = shell->display;
|
||||||
|
gimp = gimp_display_get_gimp (display);
|
||||||
|
image = gimp_display_get_image (display);
|
||||||
|
|
||||||
|
if (! image)
|
||||||
|
return;
|
||||||
|
|
||||||
|
GIMP_LOG (TOOL_EVENTS, "grab_notify (display %p): was_grabbed = %s",
|
||||||
|
display, was_grabbed ? "TRUE" : "FALSE");
|
||||||
|
|
||||||
|
if (! was_grabbed)
|
||||||
|
{
|
||||||
|
if (! gimp_image_is_empty (image))
|
||||||
|
tool_manager_modifier_state_active (gimp, 0, display);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
gimp_display_shell_buffer_stroke (GimpMotionBuffer *buffer,
|
gimp_display_shell_buffer_stroke (GimpMotionBuffer *buffer,
|
||||||
const GimpCoords *coords,
|
const GimpCoords *coords,
|
||||||
@ -1359,17 +1389,21 @@ gimp_display_shell_key_to_state (gint key)
|
|||||||
case GDK_KEY_Alt_L:
|
case GDK_KEY_Alt_L:
|
||||||
case GDK_KEY_Alt_R:
|
case GDK_KEY_Alt_R:
|
||||||
return GDK_MOD1_MASK;
|
return GDK_MOD1_MASK;
|
||||||
|
|
||||||
case GDK_KEY_Shift_L:
|
case GDK_KEY_Shift_L:
|
||||||
case GDK_KEY_Shift_R:
|
case GDK_KEY_Shift_R:
|
||||||
return GDK_SHIFT_MASK;
|
return GDK_SHIFT_MASK;
|
||||||
|
|
||||||
case GDK_KEY_Control_L:
|
case GDK_KEY_Control_L:
|
||||||
case GDK_KEY_Control_R:
|
case GDK_KEY_Control_R:
|
||||||
return GDK_CONTROL_MASK;
|
return GDK_CONTROL_MASK;
|
||||||
|
|
||||||
#ifdef GDK_WINDOWING_QUARTZ
|
#ifdef GDK_WINDOWING_QUARTZ
|
||||||
case GDK_KEY_Meta_L:
|
case GDK_KEY_Meta_L:
|
||||||
case GDK_KEY_Meta_R:
|
case GDK_KEY_Meta_R:
|
||||||
return GDK_MOD2_MASK;
|
return GDK_MOD2_MASK;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,10 @@ gboolean gimp_display_shell_events (GtkWidget *widget,
|
|||||||
gboolean gimp_display_shell_canvas_tool_events (GtkWidget *widget,
|
gboolean gimp_display_shell_canvas_tool_events (GtkWidget *widget,
|
||||||
GdkEvent *event,
|
GdkEvent *event,
|
||||||
GimpDisplayShell *shell);
|
GimpDisplayShell *shell);
|
||||||
|
void gimp_display_shell_canvas_grab_notify (GtkWidget *widget,
|
||||||
|
gboolean was_grabbed,
|
||||||
|
GimpDisplayShell *shell);
|
||||||
|
|
||||||
void gimp_display_shell_buffer_stroke (GimpMotionBuffer *buffer,
|
void gimp_display_shell_buffer_stroke (GimpMotionBuffer *buffer,
|
||||||
const GimpCoords *coords,
|
const GimpCoords *coords,
|
||||||
guint32 time,
|
guint32 time,
|
||||||
|
@ -584,6 +584,10 @@ gimp_display_shell_constructed (GObject *object)
|
|||||||
gimp_devices_add_widget (shell->display->gimp, shell->hrule);
|
gimp_devices_add_widget (shell->display->gimp, shell->hrule);
|
||||||
gimp_devices_add_widget (shell->display->gimp, shell->vrule);
|
gimp_devices_add_widget (shell->display->gimp, shell->vrule);
|
||||||
|
|
||||||
|
g_signal_connect (shell->canvas, "grab-notify",
|
||||||
|
G_CALLBACK (gimp_display_shell_canvas_grab_notify),
|
||||||
|
shell);
|
||||||
|
|
||||||
g_signal_connect (shell->canvas, "realize",
|
g_signal_connect (shell->canvas, "realize",
|
||||||
G_CALLBACK (gimp_display_shell_canvas_realize),
|
G_CALLBACK (gimp_display_shell_canvas_realize),
|
||||||
shell);
|
shell);
|
||||||
|
Reference in New Issue
Block a user