mirror of https://github.com/GNOME/gimp.git
don't connect to "event" and don't connect any canvas event to
2004-11-09 Michael Natterer <mitch@gimp.org> * 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.
This commit is contained in:
parent
76369f7911
commit
9ce333eb75
26
ChangeLog
26
ChangeLog
|
@ -1,3 +1,29 @@
|
|||
2004-11-09 Michael Natterer <mitch@gimp.org>
|
||||
|
||||
* 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 <sven@gimp.org>
|
||||
|
||||
* libgimpwidgets/gimpoffsetarea.c (gimp_offset_area_resize): queue
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in New Issue