mirror of https://github.com/GNOME/gimp.git
Issue 1652 - Empty toolbox has very large minimum height in MWM
Adjust size negotiation of GimpToolPalette to take the monitor's workarea into account: request space for enough columns so that the widget's height is never more than 70% of the workarea height, and enough rows so that it's never wider than 90% of the workarea.
This commit is contained in:
parent
b70de60680
commit
46f528131b
|
@ -54,9 +54,6 @@ typedef struct _GimpToolPalettePrivate GimpToolPalettePrivate;
|
||||||
struct _GimpToolPalettePrivate
|
struct _GimpToolPalettePrivate
|
||||||
{
|
{
|
||||||
GimpToolbox *toolbox;
|
GimpToolbox *toolbox;
|
||||||
|
|
||||||
gint tool_rows;
|
|
||||||
gint tool_columns;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define GET_PRIVATE(p) G_TYPE_INSTANCE_GET_PRIVATE (p, \
|
#define GET_PRIVATE(p) G_TYPE_INSTANCE_GET_PRIVATE (p, \
|
||||||
|
@ -74,8 +71,8 @@ static void gimp_tool_palette_get_preferred_height(GtkWidget *widget,
|
||||||
gint *pref_width);
|
gint *pref_width);
|
||||||
static void gimp_tool_palette_height_for_width (GtkWidget *widget,
|
static void gimp_tool_palette_height_for_width (GtkWidget *widget,
|
||||||
gint width,
|
gint width,
|
||||||
gint *min_width,
|
gint *min_height,
|
||||||
gint *pref_width);
|
gint *pref_height);
|
||||||
static void gimp_tool_palette_style_updated (GtkWidget *widget);
|
static void gimp_tool_palette_style_updated (GtkWidget *widget);
|
||||||
static void gimp_tool_palette_hierarchy_changed (GtkWidget *widget,
|
static void gimp_tool_palette_hierarchy_changed (GtkWidget *widget,
|
||||||
GtkWidget *previous_toplevel);
|
GtkWidget *previous_toplevel);
|
||||||
|
@ -140,6 +137,54 @@ gimp_tool_palette_get_request_mode (GtkWidget *widget)
|
||||||
return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
|
return GTK_SIZE_REQUEST_HEIGHT_FOR_WIDTH;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gint
|
||||||
|
gimp_tool_palette_get_n_tools (GimpToolPalette *palette,
|
||||||
|
gint *button_width,
|
||||||
|
gint *button_height,
|
||||||
|
gint *min_columns,
|
||||||
|
gint *min_rows)
|
||||||
|
{
|
||||||
|
GimpToolPalettePrivate *private = GET_PRIVATE (palette);
|
||||||
|
Gimp *gimp;
|
||||||
|
GList *list;
|
||||||
|
GdkMonitor *monitor;
|
||||||
|
GdkRectangle workarea;
|
||||||
|
gint n_tools;
|
||||||
|
gint max_rows;
|
||||||
|
gint max_columns;
|
||||||
|
|
||||||
|
if (! gimp_tool_palette_get_button_size (palette,
|
||||||
|
button_width, button_height))
|
||||||
|
{
|
||||||
|
/* arbitrary values, just to simplify our callers */
|
||||||
|
*button_width = 24;
|
||||||
|
*button_height = 24;
|
||||||
|
}
|
||||||
|
|
||||||
|
gimp = gimp_toolbox_get_context (private->toolbox)->gimp;
|
||||||
|
|
||||||
|
for (list = gimp_get_tool_info_iter (gimp), n_tools = 0;
|
||||||
|
list;
|
||||||
|
list = list->next)
|
||||||
|
{
|
||||||
|
GimpToolInfo *tool_info = list->data;
|
||||||
|
|
||||||
|
if (tool_info->visible)
|
||||||
|
n_tools++;
|
||||||
|
}
|
||||||
|
|
||||||
|
monitor = gimp_widget_get_monitor (GTK_WIDGET (palette));
|
||||||
|
gdk_monitor_get_workarea (monitor, &workarea);
|
||||||
|
|
||||||
|
max_columns = (workarea.width * 0.9) / *button_width;
|
||||||
|
max_rows = (workarea.height * 0.7) / *button_height;
|
||||||
|
|
||||||
|
*min_columns = MAX (2, n_tools / max_rows);
|
||||||
|
*min_rows = MAX (1, n_tools / max_columns);
|
||||||
|
|
||||||
|
return n_tools;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gimp_tool_palette_get_preferred_width (GtkWidget *widget,
|
gimp_tool_palette_get_preferred_width (GtkWidget *widget,
|
||||||
gint *min_width,
|
gint *min_width,
|
||||||
|
@ -147,12 +192,15 @@ gimp_tool_palette_get_preferred_width (GtkWidget *widget,
|
||||||
{
|
{
|
||||||
gint button_width;
|
gint button_width;
|
||||||
gint button_height;
|
gint button_height;
|
||||||
|
gint min_columns;
|
||||||
|
gint min_rows;
|
||||||
|
|
||||||
if (gimp_tool_palette_get_button_size (GIMP_TOOL_PALETTE (widget),
|
gimp_tool_palette_get_n_tools (GIMP_TOOL_PALETTE (widget),
|
||||||
&button_width, &button_height))
|
&button_width, &button_height,
|
||||||
{
|
&min_columns, &min_rows);
|
||||||
*min_width = *pref_width = button_width;
|
|
||||||
}
|
*min_width = min_columns * button_width;
|
||||||
|
*pref_width = min_columns * button_width;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -162,12 +210,15 @@ gimp_tool_palette_get_preferred_height (GtkWidget *widget,
|
||||||
{
|
{
|
||||||
gint button_width;
|
gint button_width;
|
||||||
gint button_height;
|
gint button_height;
|
||||||
|
gint min_columns;
|
||||||
|
gint min_rows;
|
||||||
|
|
||||||
if (gimp_tool_palette_get_button_size (GIMP_TOOL_PALETTE (widget),
|
gimp_tool_palette_get_n_tools (GIMP_TOOL_PALETTE (widget),
|
||||||
&button_width, &button_height))
|
&button_width, &button_height,
|
||||||
{
|
&min_columns, &min_rows);
|
||||||
*min_height = *pref_height = button_height;
|
|
||||||
}
|
*min_height = min_rows * button_height;
|
||||||
|
*pref_height = min_rows * button_height;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -176,40 +227,25 @@ gimp_tool_palette_height_for_width (GtkWidget *widget,
|
||||||
gint *min_height,
|
gint *min_height,
|
||||||
gint *pref_height)
|
gint *pref_height)
|
||||||
{
|
{
|
||||||
GimpToolPalettePrivate *private = GET_PRIVATE (widget);
|
gint n_tools;
|
||||||
gint button_width;
|
gint button_width;
|
||||||
gint button_height;
|
gint button_height;
|
||||||
|
gint min_columns;
|
||||||
|
gint min_rows;
|
||||||
|
gint tool_columns;
|
||||||
|
gint tool_rows;
|
||||||
|
|
||||||
if (gimp_tool_palette_get_button_size (GIMP_TOOL_PALETTE (widget),
|
n_tools = gimp_tool_palette_get_n_tools (GIMP_TOOL_PALETTE (widget),
|
||||||
&button_width, &button_height))
|
&button_width, &button_height,
|
||||||
{
|
&min_columns, &min_rows);
|
||||||
Gimp *gimp = gimp_toolbox_get_context (private->toolbox)->gimp;
|
|
||||||
GList *list;
|
|
||||||
gint n_tools;
|
|
||||||
gint tool_rows;
|
|
||||||
gint tool_columns;
|
|
||||||
|
|
||||||
for (list = gimp_get_tool_info_iter (gimp), n_tools = 0;
|
tool_columns = MAX (min_columns, width / button_width);
|
||||||
list;
|
tool_rows = n_tools / tool_columns;
|
||||||
list = list->next)
|
|
||||||
{
|
|
||||||
GimpToolInfo *tool_info = list->data;
|
|
||||||
|
|
||||||
if (tool_info->visible)
|
if (n_tools % tool_columns)
|
||||||
n_tools++;
|
tool_rows++;
|
||||||
}
|
|
||||||
|
|
||||||
tool_columns = MAX (1, width / button_width);
|
*min_height = *pref_height = tool_rows * button_height;
|
||||||
tool_rows = n_tools / tool_columns;
|
|
||||||
|
|
||||||
if (n_tools % tool_columns)
|
|
||||||
tool_rows++;
|
|
||||||
|
|
||||||
private->tool_rows = tool_rows;
|
|
||||||
private->tool_columns = tool_columns;
|
|
||||||
|
|
||||||
*min_height = *pref_height = tool_rows * button_height;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue