[Xfce4-commits] <xfce4-panel:master> Pager: Fixing infinite loopin in the WNCK pager aspect ratio workaround.
Nick Schermer
noreply at xfce.org
Fri Feb 24 16:42:05 CET 2012
Updating branch refs/heads/master
to c8f8ea33dd618f4a5477835b77e23f13ee51a365 (commit)
from 93e0a36c3cc9e1495ff8204081dec1f3f6a624e7 (commit)
commit c8f8ea33dd618f4a5477835b77e23f13ee51a365
Author: Andrzej <ndrwrdck at gmail.com>
Date: Mon Jan 23 15:53:12 2012 +0900
Pager: Fixing infinite loopin in the WNCK pager aspect ratio workaround.
Previous workaround wasn't sufficiently stable. Infinite looping could be
triggered if the user set:
panel size = 16
panel rows = 1
workspace rows = 1
no of workspaces = 100
and then started increasing/decreasing panel size by 1.
This fix rearranges the code (storing last pager height instead
of its aspect ratio) and introduces a minimum WNCK panel height of 10px.
Tbis makes it stable in the above scenario.
Still, we should push for a real fix in the WNCK pager:
https://bugzilla.gnome.org/show_bug.cgi?id=664779
plugins/pager/pager.c | 27 +++++++++++++++------------
1 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/plugins/pager/pager.c b/plugins/pager/pager.c
index 14be569..65be4cc 100644
--- a/plugins/pager/pager.c
+++ b/plugins/pager/pager.c
@@ -94,8 +94,8 @@ struct _PagerPlugin
/* panel size */
gint size;
- /* WNCK pager aspect ratio */
- gdouble aspect;
+ /* last height of the WNCK pager in deskbar mode */
+ gint height;
};
enum
@@ -170,7 +170,7 @@ pager_plugin_init (PagerPlugin *plugin)
plugin->rows = 1;
plugin->pager = NULL;
plugin->size = 0;
- plugin->aspect = 1.;
+ plugin->height = 1;
}
@@ -422,18 +422,21 @@ pager_plugin_size_request (GtkWidget *widget,
if (requisition->width > 1)
aspect = (gdouble) requisition->height / (gdouble) requisition->width;
- /* Update the memorized aspect value only if change is big enough */
+ /* Update the memorized height value only if change is big enough */
/* WNCK pager requests resizing if the allocated vertical dimension */
/* is different from the previously allocated vertical dimension. */
- /* Therefore, we only want to change the aspect ratio (and allocation) */
+ /* Therefore, we only want to change it */
/* when it corresponds to a "real" aspect ratio change. */
- /* The threshold is arbitrary - small value may cause infinite looping, */
- /* large value reduces accuracy of pager scaling. */
- if (fabs ((plugin->aspect - aspect) * plugin->size) > 3.0)
- plugin->aspect = aspect;
+ /* The threshold and the minimum height values are arbitrary. */
+ /* They are the tradeoff between the accuracy of vertical size */
+ /* and eliminating infinite resizing loop. */
+ /* The values below eliminate looping in a worst-case condition: */
+ /* panel size = 16<->17, workspace rows = 1, no of workspaces = 100 */
+ if (abs (rint (plugin->size * aspect) - plugin->height) > 3)
+ plugin->height = MAX (rint (plugin->size * aspect), 10);
requisition->width = plugin->size;
- requisition->height = rint (requisition->width * plugin->aspect);
+ requisition->height = rint (requisition->width * aspect);
}
}
@@ -446,13 +449,13 @@ pager_plugin_size_allocate (GtkWidget *widget,
PagerPlugin *plugin = XFCE_PAGER_PLUGIN (widget);
XfcePanelPlugin *panel_plugin = XFCE_PANEL_PLUGIN (widget);
- /* if in deskbar mode, force the allocation based on memorized aspect ratio. */
+ /* if in deskbar mode, force the allocation based on memorized plugin height. */
/* WNCK pager will request resizing if it differs from previous allocation. */
if (plugin->miniature_view &&
xfce_panel_plugin_get_mode (panel_plugin) == XFCE_PANEL_PLUGIN_MODE_DESKBAR)
{
+ allocation->height = plugin->height;
allocation->width = plugin->size;
- allocation->height = rint (allocation->width * plugin->aspect);
}
gtk_widget_size_allocate (plugin->pager, allocation);
}
More information about the Xfce4-commits
mailing list