From 9ce333eb75ae127884df122423240b4b49e3c15a Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Tue, 9 Nov 2004 11:38:29 +0000 Subject: [PATCH] don't connect to "event" and don't connect any canvas event to 2004-11-09 Michael Natterer * app/display/gimpdisplayshell.c (gimp_display_shell_new): don't connect to "event" and don't connect any canvas event to gimp_display_shell_events(). Connect all tool events separately (doesn't include "configure-event" and thus fixes bug #141543). * app/display/gimpdisplayshell-callbacks.c (gimp_display_shell_canvas_tool_events): call gimp_display_shell_events() manually before doing tool event processing. * app/display/gimpdisplayshell.c * app/display/gimpdisplayshell-callbacks.[ch]: connect to "size_allocate" of the canvas, not to "configure_event" (suggested by Owen in bug #141543). * app/display/gimpdisplayshell-callbacks.[ch]: removed gimp_display_shell_popup_menu(). (gimp_display_shell_origin_button_press): emit "popup-menu" on the shell manually instead of calling above function. * app/display/gimpdisplayshell.c: added the whole menu popup code here. --- ChangeLog | 26 ++++++++ app/display/gimpdisplayshell-callbacks.c | 79 ++++++++---------------- app/display/gimpdisplayshell-callbacks.h | 6 +- app/display/gimpdisplayshell.c | 79 +++++++++++++++++++++--- 4 files changed, 126 insertions(+), 64 deletions(-) diff --git a/ChangeLog b/ChangeLog index 04fc7a4e6e..5d18f77450 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,29 @@ +2004-11-09 Michael Natterer + + * app/display/gimpdisplayshell.c (gimp_display_shell_new): don't + connect to "event" and don't connect any canvas event to + gimp_display_shell_events(). Connect all tool events separately + (doesn't include "configure-event" and thus fixes bug #141543). + + * app/display/gimpdisplayshell-callbacks.c + (gimp_display_shell_canvas_tool_events): call + gimp_display_shell_events() manually before doing tool event + processing. + + * app/display/gimpdisplayshell.c + * app/display/gimpdisplayshell-callbacks.[ch]: connect to + "size_allocate" of the canvas, not to "configure_event" + (suggested by Owen in bug #141543). + + * app/display/gimpdisplayshell-callbacks.[ch]: removed + gimp_display_shell_popup_menu(). + + (gimp_display_shell_origin_button_press): emit "popup-menu" on the + shell manually instead of calling above function. + + * app/display/gimpdisplayshell.c: added the whole menu popup code + here. + 2004-11-09 Sven Neumann * libgimpwidgets/gimpoffsetarea.c (gimp_offset_area_resize): queue diff --git a/app/display/gimpdisplayshell-callbacks.c b/app/display/gimpdisplayshell-callbacks.c index 0c193d848f..c3cceab8cf 100644 --- a/app/display/gimpdisplayshell-callbacks.c +++ b/app/display/gimpdisplayshell-callbacks.c @@ -106,11 +106,6 @@ static void gimp_display_shell_get_device_state (GimpDisplayShell *shell, static GdkModifierType gimp_display_shell_key_to_state (gint key); -static void gimp_display_shell_origin_menu_position (GtkMenu *menu, - gint *x, - gint *y, - gpointer data); - GdkEvent * gimp_display_shell_compress_motion (GimpDisplayShell *shell); @@ -318,35 +313,33 @@ gimp_display_shell_canvas_realize (GtkWidget *canvas, gimp_display_shell_draw_vectors (shell); } -gboolean -gimp_display_shell_canvas_configure (GtkWidget *widget, - GdkEventConfigure *cevent, - GimpDisplayShell *shell) +void +gimp_display_shell_canvas_size_allocate (GtkWidget *widget, + GtkAllocation *allocation, + GimpDisplayShell *shell) { /* are we in destruction? */ if (! shell->gdisp || ! shell->gdisp->shell) - return TRUE; + return; - if ((shell->disp_width != shell->canvas->allocation.width) || - (shell->disp_height != shell->canvas->allocation.height)) + if ((shell->disp_width != allocation->width) || + (shell->disp_height != allocation->height)) { - if (shell->zoom_on_resize && - shell->disp_width > 64 && - shell->disp_height > 64 && - shell->canvas->allocation.width > 64 && - shell->canvas->allocation.height > 64) + if (shell->zoom_on_resize && + shell->disp_width > 64 && + shell->disp_height > 64 && + allocation->width > 64 && + allocation->height > 64) { - gdouble scale; + gdouble scale = shell->scale; gint offset_x; gint offset_y; - scale = shell->scale; - /* multiply the zoom_factor with the ratio of the new and * old canvas diagonals */ - scale *= (sqrt (SQR (shell->canvas->allocation.width) + - SQR (shell->canvas->allocation.height)) / + scale *= (sqrt (SQR (allocation->width) + + SQR (allocation->height)) / sqrt (SQR (shell->disp_width) + SQR (shell->disp_height))); @@ -358,15 +351,13 @@ gimp_display_shell_canvas_configure (GtkWidget *widget, shell->offset_y = SCALEY (shell, offset_y); } - shell->disp_width = shell->canvas->allocation.width; - shell->disp_height = shell->canvas->allocation.height; + shell->disp_width = allocation->width; + shell->disp_height = allocation->height; gimp_display_shell_scroll_clamp_offsets (shell); gimp_display_shell_scale_setup (shell); gimp_display_shell_scaled (shell); } - - return TRUE; } gboolean @@ -458,23 +449,6 @@ gimp_display_shell_check_device_cursor (GimpDisplayShell *shell) shell->draw_cursor = ! current_device->has_cursor; } -gboolean -gimp_display_shell_popup_menu (GtkWidget *widget) -{ - GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (widget); - - gimp_context_set_display (gimp_get_user_context (shell->gdisp->gimage->gimp), - shell->gdisp); - - gimp_ui_manager_ui_popup (shell->popup_manager, "/dummy-menubar/image-popup", - GTK_WIDGET (shell), - gimp_display_shell_origin_menu_position, - shell->origin_button, - NULL, NULL); - - return TRUE; -} - gboolean gimp_display_shell_canvas_tool_events (GtkWidget *canvas, GdkEvent *event, @@ -504,6 +478,10 @@ gimp_display_shell_canvas_tool_events (GtkWidget *canvas, if (! shell->gdisp || ! shell->gdisp->shell) return TRUE; + /* set the active display before doing any other canvas event processing */ + if (gimp_display_shell_events (canvas, event, shell)) + return TRUE; + gdisp = shell->gdisp; gimage = gdisp->gimage; gimp = gimage->gimp; @@ -1507,7 +1485,11 @@ gimp_display_shell_origin_button_press (GtkWidget *widget, if (! shell->gdisp->gimage->gimp->busy) { if (event->button == 1) - gimp_display_shell_popup_menu (GTK_WIDGET (shell)); + { + gboolean unused; + + g_signal_emit_by_name (shell, "popup-menu", &unused); + } } /* Return TRUE to stop signal emission so the button doesn't grab the @@ -1746,15 +1728,6 @@ gimp_display_shell_key_to_state (gint key) } } -static void -gimp_display_shell_origin_menu_position (GtkMenu *menu, - gint *x, - gint *y, - gpointer data) -{ - gimp_button_menu_position (GTK_WIDGET (data), menu, GTK_POS_RIGHT, x, y); -} - /* gimp_display_shell_compress_motion: * * This function walks the whole GDK event queue seeking motion events diff --git a/app/display/gimpdisplayshell-callbacks.h b/app/display/gimpdisplayshell-callbacks.h index 7c3706c199..20785fcf6f 100644 --- a/app/display/gimpdisplayshell-callbacks.h +++ b/app/display/gimpdisplayshell-callbacks.h @@ -40,13 +40,12 @@ gboolean gimp_display_shell_events (GtkWidget *widget, void gimp_display_shell_canvas_realize (GtkWidget *widget, GimpDisplayShell *shell); -gboolean gimp_display_shell_canvas_configure (GtkWidget *widget, - GdkEventConfigure *cevent, +void gimp_display_shell_canvas_size_allocate (GtkWidget *widget, + GtkAllocation *alloc, GimpDisplayShell *shell); gboolean gimp_display_shell_canvas_expose (GtkWidget *widget, GdkEventExpose *eevent, GimpDisplayShell *shell); -gboolean gimp_display_shell_popup_menu (GtkWidget *widget); gboolean gimp_display_shell_canvas_tool_events (GtkWidget *widget, GdkEvent *event, GimpDisplayShell *shell); @@ -57,6 +56,7 @@ gboolean gimp_display_shell_hruler_button_press (GtkWidget *widget, gboolean gimp_display_shell_vruler_button_press (GtkWidget *widget, GdkEventButton *bevent, GimpDisplayShell *shell); + gboolean gimp_display_shell_origin_button_press (GtkWidget *widget, GdkEventButton *bevent, GimpDisplayShell *shell); diff --git a/app/display/gimpdisplayshell.c b/app/display/gimpdisplayshell.c index 51ad34e39d..a51f8dcfa0 100644 --- a/app/display/gimpdisplayshell.c +++ b/app/display/gimpdisplayshell.c @@ -119,9 +119,15 @@ static void gimp_display_shell_screen_changed (GtkWidget *widget, GdkScreen *previous); static gboolean gimp_display_shell_delete_event (GtkWidget *widget, GdkEventAny *aevent); +static gboolean gimp_display_shell_popup_menu (GtkWidget *widget); static void gimp_display_shell_real_scaled (GimpDisplayShell *shell); +static void gimp_display_shell_menu_position (GtkMenu *menu, + gint *x, + gint *y, + gpointer data); + static guint display_shell_signals[LAST_SIGNAL] = { 0 }; @@ -540,6 +546,23 @@ gimp_display_shell_delete_event (GtkWidget *widget, return TRUE; } +static gboolean +gimp_display_shell_popup_menu (GtkWidget *widget) +{ + GimpDisplayShell *shell = GIMP_DISPLAY_SHELL (widget); + + gimp_context_set_display (gimp_get_user_context (shell->gdisp->gimage->gimp), + shell->gdisp); + + gimp_ui_manager_ui_popup (shell->popup_manager, "/dummy-menubar/image-popup", + GTK_WIDGET (shell), + gimp_display_shell_menu_position, + shell->origin_button, + NULL, NULL); + + return TRUE; +} + static void gimp_display_shell_real_scaled (GimpDisplayShell *shell) { @@ -559,6 +582,18 @@ gimp_display_shell_real_scaled (GimpDisplayShell *shell) gimp_ui_manager_update (shell->popup_manager, shell->gdisp); } +static void +gimp_display_shell_menu_position (GtkMenu *menu, + gint *x, + gint *y, + gpointer data) +{ + gimp_button_menu_position (GTK_WIDGET (data), menu, GTK_POS_RIGHT, x, y); +} + + +/* public functions */ + GtkWidget * gimp_display_shell_new (GimpDisplay *gdisp, GimpUnit unit, @@ -845,19 +880,47 @@ gimp_display_shell_new (GimpDisplay *gdisp, g_signal_connect (shell->canvas, "realize", G_CALLBACK (gimp_display_shell_canvas_realize), shell); - - /* set the active display before doing any other canvas event processing */ - g_signal_connect (shell->canvas, "event", - G_CALLBACK (gimp_display_shell_events), + g_signal_connect (shell->canvas, "size_allocate", + G_CALLBACK (gimp_display_shell_canvas_size_allocate), shell); - g_signal_connect (shell->canvas, "expose_event", G_CALLBACK (gimp_display_shell_canvas_expose), shell); - g_signal_connect (shell->canvas, "configure_event", - G_CALLBACK (gimp_display_shell_canvas_configure), + + g_signal_connect (shell->canvas, "enter_notify_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), shell); - g_signal_connect (shell->canvas, "event", + g_signal_connect (shell->canvas, "leave_notify_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), + shell); + g_signal_connect (shell->canvas, "proximity_in_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), + shell); + g_signal_connect (shell->canvas, "proximity_out_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), + shell); + g_signal_connect (shell->canvas, "focus_in_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), + shell); + g_signal_connect (shell->canvas, "focus_out_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), + shell); + g_signal_connect (shell->canvas, "button_press_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), + shell); + g_signal_connect (shell->canvas, "button_release_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), + shell); + g_signal_connect (shell->canvas, "scroll_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), + shell); + g_signal_connect (shell->canvas, "motion_notify_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), + shell); + g_signal_connect (shell->canvas, "key_press_event", + G_CALLBACK (gimp_display_shell_canvas_tool_events), + shell); + g_signal_connect (shell->canvas, "key_release_event", G_CALLBACK (gimp_display_shell_canvas_tool_events), shell);