Move shrink_wrap() from the display to the window

Also fix all callers. This clearly needs more cleanup.
This commit is contained in:
Michael Natterer
2009-09-25 17:46:09 +02:00
parent 8c2934f626
commit 32783d7228
6 changed files with 154 additions and 116 deletions

View File

@ -500,10 +500,16 @@ gimp_display_shell_size_changed_detailed_handler (GimpImage *image,
{
if (shell->display->config->resize_windows_on_resize)
{
/* If the window is resized just center the image in it when it
* has change size
*/
gimp_display_shell_shrink_wrap (shell, FALSE);
GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (shell));
GimpImageWindow *window = GIMP_IMAGE_WINDOW (toplevel);
if (gimp_image_window_get_active_display (window) == shell->display)
{
/* If the window is resized just center the image in it when it
* has change size
*/
gimp_image_window_shrink_wrap (window, FALSE);
}
}
else
{

View File

@ -366,13 +366,22 @@ gimp_display_shell_scale (GimpDisplayShell *shell,
{
if (shell->display->config->resize_windows_on_zoom)
{
GtkWidget *toplevel;
GimpImageWindow *window;
toplevel = gtk_widget_get_toplevel (GTK_WIDGET (shell));
window = GIMP_IMAGE_WINDOW (toplevel);
/* If the window is resized on zoom, simply do the zoom and
* get things rolling
*/
gimp_zoom_model_zoom (shell->zoom, GIMP_ZOOM_TO, real_new_scale);
gimp_display_shell_scaled (shell);
gimp_display_shell_shrink_wrap (shell, FALSE);
if (gimp_image_window_get_active_display (window) == shell->display)
{
gimp_image_window_shrink_wrap (window, FALSE);
}
}
else
{
@ -657,7 +666,15 @@ gimp_display_shell_scale_resize (GimpDisplayShell *shell,
gimp_display_shell_pause (shell);
if (resize_window)
gimp_display_shell_shrink_wrap (shell, grow_only);
{
GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (shell));
GimpImageWindow *window = GIMP_IMAGE_WINDOW (toplevel);
if (gimp_image_window_get_active_display (window) == shell->display)
{
gimp_image_window_shrink_wrap (window, grow_only);
}
}
gimp_display_shell_scroll_clamp_and_update (shell);
gimp_display_shell_scaled (shell);

View File

@ -1727,113 +1727,6 @@ gimp_display_shell_resume (GimpDisplayShell *shell)
}
}
void
gimp_display_shell_shrink_wrap (GimpDisplayShell *shell,
gboolean grow_only)
{
GtkWidget *widget;
GdkScreen *screen;
GdkRectangle rect;
gint monitor;
gint disp_width, disp_height;
gint width, height;
gint max_auto_width, max_auto_height;
gint border_width, border_height;
gboolean resize = FALSE;
g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell));
if (! GTK_WIDGET_REALIZED (shell))
return;
widget = GTK_WIDGET (shell);
screen = gtk_widget_get_screen (widget);
monitor = gdk_screen_get_monitor_at_window (screen,
gtk_widget_get_window (widget));
gdk_screen_get_monitor_geometry (screen, monitor, &rect);
width = SCALEX (shell, gimp_image_get_width (shell->display->image));
height = SCALEY (shell, gimp_image_get_height (shell->display->image));
disp_width = shell->disp_width;
disp_height = shell->disp_height;
/* As long as the disp_width/disp_heightheight is larger than 1 we
* can reliably depend on it to calculate the
* border_width/border_height because that means there is enough
* room in the top-level for the canvas as well as the rulers and
* scrollbars. If it is 1 or smaller it is likely that the rulers
* and scrollbars are overlapping each other and thus we cannot use
* the normal approach to border size, so special case that.
*/
if (disp_width > 1 || !shell->vsb)
border_width = widget->allocation.width - disp_width;
else
border_width = widget->allocation.width - disp_width + shell->vsb->allocation.width;
if (disp_height > 1 || !shell->hsb)
border_height = widget->allocation.height - disp_height;
else
border_height = widget->allocation.height - disp_height + shell->hsb->allocation.height;
max_auto_width = (rect.width - border_width) * 0.75;
max_auto_height = (rect.height - border_height) * 0.75;
/* If one of the display dimensions has changed and one of the
* dimensions fits inside the screen
*/
if (((width + border_width) < rect.width || (height + border_height) < rect.height) &&
(width != disp_width || height != disp_height))
{
width = ((width + border_width) < rect.width) ? width : max_auto_width;
height = ((height + border_height) < rect.height) ? height : max_auto_height;
resize = TRUE;
}
/* If the projected dimension is greater than current, but less than
* 3/4 of the screen size, expand automagically
*/
else if ((width > disp_width || height > disp_height) &&
(disp_width < max_auto_width || disp_height < max_auto_height))
{
width = MIN (max_auto_width, width);
height = MIN (max_auto_height, height);
resize = TRUE;
}
if (resize)
{
/* FIXME image window */
if (width < GIMP_IMAGE_WINDOW (shell)->statusbar->requisition.width)
width = GIMP_IMAGE_WINDOW (shell)->statusbar->requisition.width;
width = width + border_width;
height = height + border_height;
if (grow_only)
{
if (width < widget->allocation.width)
width = widget->allocation.width;
if (height < widget->allocation.height)
height = widget->allocation.height;
}
gtk_window_resize (GTK_WINDOW (shell), width, height);
}
/* A wrap always means that we should center the image too. If the
* window changes size another center will be done in
* GimpDisplayShell::configure_event().
*/
gimp_display_shell_scroll_center_image (shell, TRUE, TRUE);
}
/**
* gimp_display_shell_set_highlight:
* @shell: a #GimpDisplayShell

View File

@ -277,9 +277,6 @@ void gimp_display_shell_flush (GimpDisplayShell *shell,
void gimp_display_shell_pause (GimpDisplayShell *shell);
void gimp_display_shell_resume (GimpDisplayShell *shell);
void gimp_display_shell_shrink_wrap (GimpDisplayShell *shell,
gboolean grow_only);
void gimp_display_shell_set_highlight (GimpDisplayShell *shell,
const GdkRectangle *highlight);
void gimp_display_shell_set_mask (GimpDisplayShell *shell,

View File

@ -20,10 +20,13 @@
#include <gegl.h>
#include <gtk/gtk.h>
#include "libgimpmath/gimpmath.h"
#include "libgimpwidgets/gimpwidgets.h"
#include "display-types.h"
#include "core/gimpimage.h"
#include "widgets/gimpactiongroup.h"
#include "widgets/gimpdialogfactory.h"
#include "widgets/gimphelp-ids.h"
@ -37,6 +40,7 @@
#include "gimpdisplayshell-appearance.h"
#include "gimpdisplayshell-close.h"
#include "gimpdisplayshell-progress.h"
#include "gimpdisplayshell-scroll.h"
#include "gimpimagewindow.h"
#include "gimpstatusbar.h"
@ -545,6 +549,124 @@ gimp_image_window_get_fullscreen (GimpImageWindow *window)
return (window->window_state & GDK_WINDOW_STATE_FULLSCREEN) != 0;
}
void
gimp_image_window_shrink_wrap (GimpImageWindow *window,
gboolean grow_only)
{
GimpDisplay *active_display;
GimpDisplayShell *active_shell;
GtkWidget *widget;
GdkScreen *screen;
GdkRectangle rect;
gint monitor;
gint disp_width, disp_height;
gint width, height;
gint max_auto_width, max_auto_height;
gint border_width, border_height;
gboolean resize = FALSE;
g_return_if_fail (GIMP_IS_IMAGE_WINDOW (window));
if (! GTK_WIDGET_REALIZED (window))
return;
/* FIXME this so needs cleanup and shell/window separation */
active_display = gimp_image_window_get_active_display (window);
active_shell = GIMP_DISPLAY_SHELL (active_display->shell);
widget = GTK_WIDGET (window);
screen = gtk_widget_get_screen (widget);
monitor = gdk_screen_get_monitor_at_window (screen,
gtk_widget_get_window (widget));
gdk_screen_get_monitor_geometry (screen, monitor, &rect);
width = SCALEX (active_shell, gimp_image_get_width (active_display->image));
height = SCALEY (active_shell, gimp_image_get_height (active_display->image));
disp_width = active_shell->disp_width;
disp_height = active_shell->disp_height;
/* As long as the disp_width/disp_height is larger than 1 we
* can reliably depend on it to calculate the
* border_width/border_height because that means there is enough
* room in the top-level for the canvas as well as the rulers and
* scrollbars. If it is 1 or smaller it is likely that the rulers
* and scrollbars are overlapping each other and thus we cannot use
* the normal approach to border size, so special case that.
*/
if (disp_width > 1 || !active_shell->vsb)
border_width = widget->allocation.width - disp_width;
else
border_width = widget->allocation.width - disp_width + active_shell->vsb->allocation.width;
if (disp_height > 1 || !active_shell->hsb)
border_height = widget->allocation.height - disp_height;
else
border_height = widget->allocation.height - disp_height + active_shell->hsb->allocation.height;
max_auto_width = (rect.width - border_width) * 0.75;
max_auto_height = (rect.height - border_height) * 0.75;
/* If one of the display dimensions has changed and one of the
* dimensions fits inside the screen
*/
if (((width + border_width) < rect.width ||
(height + border_height) < rect.height) &&
(width != disp_width ||
height != disp_height))
{
width = ((width + border_width) < rect.width) ? width : max_auto_width;
height = ((height + border_height) < rect.height) ? height : max_auto_height;
resize = TRUE;
}
/* If the projected dimension is greater than current, but less than
* 3/4 of the screen size, expand automagically
*/
else if ((width > disp_width ||
height > disp_height) &&
(disp_width < max_auto_width ||
disp_height < max_auto_height))
{
width = MIN (max_auto_width, width);
height = MIN (max_auto_height, height);
resize = TRUE;
}
if (resize)
{
if (width < window->statusbar->requisition.width)
width = window->statusbar->requisition.width;
width = width + border_width;
height = height + border_height;
if (grow_only)
{
if (width < widget->allocation.width)
width = widget->allocation.width;
if (height < widget->allocation.height)
height = widget->allocation.height;
}
gtk_window_resize (GTK_WINDOW (window), width, height);
}
/* A wrap always means that we should center the image too. If the
* window changes size another center will be done in
* GimpDisplayShell::configure_event().
*/
/* FIXME multiple shells */
gimp_display_shell_scroll_center_image (active_shell, TRUE, TRUE);
}
/* private functions */

View File

@ -64,5 +64,8 @@ void gimp_image_window_set_fullscreen (GimpImageWindow *window,
gboolean fullscreen);
gboolean gimp_image_window_get_fullscreen (GimpImageWindow *window);
void gimp_image_window_shrink_wrap (GimpImageWindow *window,
gboolean grow_only);
#endif /* __GIMP_IMAGE_WINDOW_H__ */