This is an automated email from the git hooks/post-receive script. n i n e t l s p u s h e d a c o m m i t t o b r a n c h m a s t e r in repository panel-plugins/xfce4-statusnotifier-plugin.
commit e5f9666ca721527fcdb4d86e1461f9ad50cc8a4a Author: Viktor Odintsev <[email protected]> Date: Fri Jul 14 00:53:03 2017 +0300 Fix non-square icons --- panel-plugin/sn-box.c | 184 ++++++++++++++++++++------------------------- panel-plugin/sn-icon-box.c | 43 ++++++++--- 2 files changed, 116 insertions(+), 111 deletions(-) diff --git a/panel-plugin/sn-box.c b/panel-plugin/sn-box.c index e9d1067..90ec3ee 100644 --- a/panel-plugin/sn-box.c +++ b/panel-plugin/sn-box.c @@ -54,10 +54,6 @@ static void sn_box_forall (GtkContain static GType sn_box_child_type (GtkContainer *container); -static void sn_box_get_preferred_length (GtkWidget *widget, - gint *minimal_length, - gint *natural_length); - static void sn_box_get_preferred_width (GtkWidget *widget, gint *minimal_width, gint *natural_width); @@ -314,17 +310,22 @@ sn_box_child_type (GtkContainer *container) static void -sn_box_get_preferred_length (GtkWidget *widget, +sn_box_measure_and_allocate (GtkWidget *widget, gint *minimum_length, - gint *natural_length) + gint *natural_length, + gboolean allocate, + gint x0, + gint y0, + gboolean horizontal) { - SnBox *box = XFCE_SN_BOX (widget); - SnButton *button; - GList *known_items, *li, *li_int, *li_tmp; - gint panel_size, icon_size, size, nrows; - gboolean single_row, square_icons; - gint x, index; - GtkRequisition child_req; + SnBox *box = XFCE_SN_BOX (widget); + SnButton *button; + GList *known_items, *li, *li_int, *li_tmp; + gint panel_size, icon_size, hx_size, hy_size, nrows; + gboolean single_row, single_horizontal, square_icons; + gint total_length, column_length, item_length, row; + GtkRequisition child_req; + GtkAllocation child_alloc; panel_size = sn_config_get_panel_size (box->config); icon_size = sn_config_get_icon_size (box->config); @@ -333,17 +334,20 @@ sn_box_get_preferred_length (GtkWidget *widget, icon_size += 2; /* additional padding */ if (square_icons) { - nrows = MAX (1, sn_config_get_nrows (box->config)); - size = panel_size / (single_row ? 1 : nrows); + nrows = single_row ? 1 : MAX (1, sn_config_get_nrows (box->config)); + hx_size = hy_size = panel_size / nrows; } else { - size = MIN (icon_size, panel_size); - nrows = single_row ? 1 : MAX (1, panel_size / size); + hx_size = MIN (icon_size, panel_size); + nrows = single_row ? 1 : MAX (1, panel_size / hx_size); + hy_size = panel_size / nrows; } - x = 0; - index = 0; + total_length = 0; + column_length = 0; + item_length = 0; + row = 0; known_items = sn_config_get_known_items (box->config); for (li = known_items; li != NULL; li = li->next) @@ -360,18 +364,63 @@ sn_box_get_preferred_length (GtkWidget *widget, gtk_widget_get_preferred_size (GTK_WIDGET (button), NULL, &child_req); - /* for each first item in row */ - if (index % nrows == 0) - x += size; - index += 1; + if (horizontal) + { + item_length = square_icons ? hx_size : MAX (hx_size, child_req.width); + column_length = MAX (column_length, item_length); + single_horizontal = FALSE; + } + else + { + item_length = MAX (MIN (panel_size, child_req.width), hy_size); + column_length = hx_size; + single_horizontal = !square_icons && child_req.width > child_req.height; + } + + if (single_horizontal) + { + if (row > 0) + total_length += hx_size; + row = -1; /* will become 0 later and take the full length */ + } + + if (allocate) + { + if (horizontal) + { + child_alloc.x = x0 + total_length; + child_alloc.y = y0 + row * hy_size; + child_alloc.width = item_length; + child_alloc.height = hy_size; + } + else + { + child_alloc.x = x0 + (single_horizontal ? 0 : row * hy_size); + child_alloc.y = y0 + total_length; + child_alloc.width = item_length; + child_alloc.height = hx_size; + } + + gtk_widget_size_allocate (GTK_WIDGET (button), &child_alloc); + } + + row = (row + 1) % nrows; + + if (row == 0) + { + total_length += column_length; + column_length = 0; + } } } + total_length += column_length; + if (minimum_length != NULL) - *minimum_length = x; + *minimum_length = total_length; if (natural_length != NULL) - *natural_length = x; + *natural_length = total_length; } @@ -386,7 +435,8 @@ sn_box_get_preferred_width (GtkWidget *widget, if (sn_config_get_panel_orientation (box->config) == GTK_ORIENTATION_HORIZONTAL) { - sn_box_get_preferred_length (widget, minimum_width, natural_width); + sn_box_measure_and_allocate (widget, minimum_width, natural_width, + FALSE, 0, 0, TRUE); } else { @@ -410,7 +460,8 @@ sn_box_get_preferred_height (GtkWidget *widget, if (sn_config_get_panel_orientation (box->config) == GTK_ORIENTATION_VERTICAL) { - sn_box_get_preferred_length (widget, minimum_height, natural_height); + sn_box_measure_and_allocate (widget, minimum_height, natural_height, + FALSE, 0, 0, FALSE); } else { @@ -428,83 +479,14 @@ static void sn_box_size_allocate (GtkWidget *widget, GtkAllocation *allocation) { - SnBox *box = XFCE_SN_BOX (widget); - SnButton *button; - GtkAllocation child_alloc; - gint panel_size, icon_size, xsize, ysize, nrows; - gboolean single_row, square_icons; - gint x, y, row; - GList *known_items, *li, *li_int, *li_tmp; - GtkOrientation panel_orientation; - - row = 0; - x = 0; - y = 0; + SnBox *box = XFCE_SN_BOX (widget); gtk_widget_set_allocation (widget, allocation); - panel_size = sn_config_get_panel_size (box->config); - icon_size = sn_config_get_icon_size (box->config); - single_row = sn_config_get_single_row (box->config); - square_icons = sn_config_get_square_icons (box->config); - icon_size += 2; /* additional padding */ - if (square_icons) - { - nrows = MAX (1, sn_config_get_nrows (box->config)); - xsize = ysize = panel_size / (single_row ? 1 : nrows); - } - else - { - xsize = MIN (icon_size, panel_size); - nrows = single_row ? 1 : MAX (1, panel_size / xsize); - ysize = panel_size / nrows; - } - - panel_orientation = sn_config_get_panel_orientation (box->config); - - known_items = sn_config_get_known_items (box->config); - for (li = known_items; li != NULL; li = li->next) - { - li_int = g_hash_table_lookup (box->children, li->data); - for (li_tmp = li_int; li_tmp != NULL; li_tmp = li_tmp->next) - { - button = li_int->data; - if (sn_config_is_hidden (box->config, - sn_button_get_name (button))) - { - continue; - } - - if (nrows == 1) - y = (panel_size - ysize + 1) / 2; - else - y = (2 * row * (panel_size - ysize) + nrows - 1) / (2 * nrows - 2); - - if (panel_orientation == GTK_ORIENTATION_HORIZONTAL) - { - child_alloc.x = allocation->x + x; - child_alloc.y = allocation->y + y; - child_alloc.width = xsize; - child_alloc.height = ysize; - } - else - { - child_alloc.x = allocation->x + y; - child_alloc.y = allocation->y + x; - child_alloc.width = ysize; - child_alloc.height = xsize; - } - - gtk_widget_size_allocate (GTK_WIDGET (button), &child_alloc); - - row += 1; - if (row >= nrows) - { - x += xsize; - row = 0; - } - } - } + sn_box_measure_and_allocate (widget, NULL, NULL, + TRUE, allocation->x, allocation->y, + sn_config_get_panel_orientation (box->config) == + GTK_ORIENTATION_HORIZONTAL); } diff --git a/panel-plugin/sn-icon-box.c b/panel-plugin/sn-icon-box.c index 0423cb7..8326f91 100644 --- a/panel-plugin/sn-icon-box.c +++ b/panel-plugin/sn-icon-box.c @@ -196,10 +196,10 @@ sn_icon_box_new (SnItem *item, gtk_widget_set_parent (box->overlay, GTK_WIDGET (box)); gtk_widget_show (box->overlay); - box->config_notify_icon_size_handler = + box->config_notify_icon_size_handler = g_signal_connect_swapped (config, "notify::icon-size", G_CALLBACK (sn_icon_box_icon_changed), box); - box->item_icon_changed_handler = + box->item_icon_changed_handler = g_signal_connect_swapped (item, "icon-changed", G_CALLBACK (sn_icon_box_icon_changed), box); sn_icon_box_icon_changed (GTK_WIDGET (box)); @@ -238,6 +238,7 @@ sn_icon_box_apply_icon (GtkWidget *image, gboolean use_pixbuf = TRUE; gint width, height; gchar *s1, *s2; + gint max_size = icon_size; gtk_image_clear (GTK_IMAGE (image)); @@ -269,7 +270,7 @@ sn_icon_box_apply_icon (GtkWidget *image, { work_pixbuf = gtk_icon_theme_load_icon (icon_theme_from_path, sn_preferred_name (), - icon_size, 0, NULL); + -1, 0, NULL); } if (work_pixbuf == NULL) @@ -293,10 +294,10 @@ sn_icon_box_apply_icon (GtkWidget *image, width = gdk_pixbuf_get_width (sn_preferred_pixbuf ()); height = gdk_pixbuf_get_height (sn_preferred_pixbuf ()); - if (width > icon_size || height > icon_size) + if (width > icon_size && height > icon_size) { /* scale pixbuf */ - if (width > height) + if (height > width) { height = icon_size * height / width; width = icon_size; @@ -306,6 +307,7 @@ sn_icon_box_apply_icon (GtkWidget *image, width = icon_size * width / height; height = icon_size; } + icon_pixbuf = gdk_pixbuf_scale_simple (sn_preferred_pixbuf (), width, height, GDK_INTERP_BILINEAR); gtk_image_set_from_pixbuf (GTK_IMAGE (image), icon_pixbuf); @@ -326,7 +328,7 @@ sn_icon_box_apply_icon (GtkWidget *image, if (work_icon_name != NULL) g_free (work_icon_name); - gtk_image_set_pixel_size (GTK_IMAGE (image), icon_size); + gtk_image_set_pixel_size (GTK_IMAGE (image), max_size); } @@ -372,14 +374,25 @@ sn_icon_box_icon_changed (GtkWidget *widget) static void sn_icon_box_get_preferred_size (GtkWidget *widget, gint *minimum_size, - gint *natural_size) + gint *natural_size, + gboolean horizontal) { SnIconBox *box = XFCE_SN_ICON_BOX (widget); gint icon_size; GtkRequisition child_req; + GdkPixbuf *pixbuf1, *pixbuf2; icon_size = sn_config_get_icon_size (box->config); + pixbuf1 = gtk_image_get_pixbuf (GTK_IMAGE (box->icon)); + pixbuf2 = gtk_image_get_pixbuf (GTK_IMAGE (box->overlay)); + if (pixbuf2 != NULL && (pixbuf1 == NULL || + gdk_pixbuf_get_width (pixbuf2) > gdk_pixbuf_get_width (pixbuf1) || + gdk_pixbuf_get_height (pixbuf2) > gdk_pixbuf_get_height (pixbuf1))) + { + pixbuf1 = pixbuf2; + } + if (box->icon != NULL) gtk_widget_get_preferred_size (box->icon, NULL, &child_req); @@ -390,7 +403,17 @@ sn_icon_box_get_preferred_size (GtkWidget *widget, *minimum_size = icon_size; if (natural_size != NULL) - *natural_size = icon_size; + { + *natural_size = 0; + if (pixbuf1 != NULL) + { + if (horizontal) + *natural_size = gdk_pixbuf_get_width (pixbuf1); + else + *natural_size = gdk_pixbuf_get_height (pixbuf1); + } + *natural_size = MAX (*natural_size, icon_size); + } } @@ -400,7 +423,7 @@ sn_icon_box_get_preferred_width (GtkWidget *widget, gint *minimum_width, gint *natural_width) { - sn_icon_box_get_preferred_size (widget, minimum_width, natural_width); + sn_icon_box_get_preferred_size (widget, minimum_width, natural_width, TRUE); } @@ -410,7 +433,7 @@ sn_icon_box_get_preferred_height (GtkWidget *widget, gint *minimum_height, gint *natural_height) { - sn_icon_box_get_preferred_size (widget, minimum_height, natural_height); + sn_icon_box_get_preferred_size (widget, minimum_height, natural_height, FALSE); } -- To stop receiving notification emails like this one, please contact the administrator of this repository. _______________________________________________ Xfce4-commits mailing list [email protected] https://mail.xfce.org/mailman/listinfo/xfce4-commits
