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:
Michael Natterer 2004-11-09 11:38:29 +00:00 committed by Michael Natterer
parent 76369f7911
commit 9ce333eb75
4 changed files with 126 additions and 64 deletions

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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);