[Pkg-xfce-commits] r3495 - in desktop/trunk/exo/debian: . patches
Yves-Alexis Perez
corsac at alioth.debian.org
Fri Sep 11 10:59:06 UTC 2009
Author: corsac
Date: 2009-09-11 22:59:06 +0000 (Fri, 11 Sep 2009)
New Revision: 3495
Added:
desktop/trunk/exo/debian/patches/03_fix-scroll-with-csw.patch
Modified:
desktop/trunk/exo/debian/changelog
desktop/trunk/exo/debian/patches/series
Log:
* debian/patches:
- 03_fix-scroll-with-csw added, fix issues when using Client Side
Windows in GTK+ 2.17+.
Modified: desktop/trunk/exo/debian/changelog
===================================================================
--- desktop/trunk/exo/debian/changelog 2009-09-11 22:44:21 UTC (rev 3494)
+++ desktop/trunk/exo/debian/changelog 2009-09-11 22:59:06 UTC (rev 3495)
@@ -1,3 +1,11 @@
+exo (0.3.102-2) UNRELEASED; urgency=low
+
+ * debian/patches:
+ - 03_fix-scroll-with-csw added, fix issues when using Client Side
+ Windows in GTK+ 2.17+.
+
+ -- Yves-Alexis Perez <corsac at debian.org> Fri, 11 Sep 2009 23:35:14 +0200
+
exo (0.3.102-1) unstable; urgency=low
* New upstream release.
Added: desktop/trunk/exo/debian/patches/03_fix-scroll-with-csw.patch
===================================================================
--- desktop/trunk/exo/debian/patches/03_fix-scroll-with-csw.patch (rev 0)
+++ desktop/trunk/exo/debian/patches/03_fix-scroll-with-csw.patch 2009-09-11 22:59:06 UTC (rev 3495)
@@ -0,0 +1,160 @@
+commit 5a90d10343f91f213cd409be6fdbb934eb3ee9c2
+Author: Jannis Pohlmann <jannis at xfce.org>
+Date: Fri Sep 11 20:10:04 2009 +0200
+
+ Use an idle function for delayed scrolling.
+
+ It looks like modifying the bin_window GdkWindow inside the expose
+ event handler of ExoIconView does no longer work with client-side
+ windows. This was done for delaying the scrolling to a certain path
+ until the widget is realized and layouting is completed.
+
+ As a result of using gdk_window_move() inside of the expose event
+ handler, the painted icon view was not up to date or mixed up after the
+ event handler had finished. Icons moved up a few pixels when hovering
+ them and with scroll positions further down the view, the contents were
+ painted twice (in the old and new state), resulting in overlapping
+ items.
+
+ This commit implements delayed scrolling via an idle function, which is
+ the only way I see right now to work around this. It may cause the
+ automatic scrolling to the previous file to be delayed for a very short
+ time, but this shouldn't be critical.
+
+ A bug was filed against GDK on
+
+ http://bugzilla.gnome.org/show_bug.cgi?id=594880
+
+diff --git a/exo/exo-icon-view.c b/exo/exo-icon-view.c
+index bdd6df0..e90647f 100644
+--- a/exo/exo-icon-view.c
++++ b/exo/exo-icon-view.c
+@@ -454,7 +454,8 @@ struct _ExoIconViewPrivate
+ GtkAdjustment *vadjustment;
+
+ gint layout_idle_id;
+-
++ gint scroll_idle_id;
++
+ gboolean doing_rubberband;
+ gint rubberband_x1, rubberband_y1;
+ gint rubberband_x2, rubberband_y2;
+@@ -1237,6 +1238,10 @@ exo_icon_view_finalize (GObject *object)
+ if (G_UNLIKELY (icon_view->priv->single_click_timeout_id != 0))
+ g_source_remove (icon_view->priv->single_click_timeout_id);
+
++ /* kill the scroll idle source */
++ if (G_UNLIKELY (icon_view->priv->scroll_idle_id != 0))
++ g_source_remove (icon_view->priv->scroll_idle_id);
++
+ /* kill the layout idle source (it's important to have this last!) */
+ if (G_UNLIKELY (icon_view->priv->layout_idle_id != 0))
+ g_source_remove (icon_view->priv->layout_idle_id);
+@@ -1642,28 +1647,6 @@ exo_icon_view_expose_event (GtkWidget *widget,
+ if (G_UNLIKELY (priv->layout_idle_id != 0))
+ return FALSE;
+
+- /* scroll to the previously remembered path (if any) */
+- if (G_UNLIKELY (priv->scroll_to_path != NULL))
+- {
+- /* grab the path from the reference and invalidate the reference */
+- path = gtk_tree_row_reference_get_path (priv->scroll_to_path);
+- gtk_tree_row_reference_free (priv->scroll_to_path);
+- priv->scroll_to_path = NULL;
+-
+- /* check if the reference was still valid */
+- if (G_LIKELY (path != NULL))
+- {
+- /* try to scroll again */
+- exo_icon_view_scroll_to_path (icon_view, path,
+- priv->scroll_to_use_align,
+- priv->scroll_to_row_align,
+- priv->scroll_to_col_align);
+-
+- /* release the path */
+- gtk_tree_path_free (path);
+- }
+- }
+-
+ /* check if we need to draw a drag indicator */
+ exo_icon_view_get_drag_dest_item (icon_view, &path, &dest_pos);
+ if (G_UNLIKELY (path != NULL))
+@@ -5437,6 +5420,8 @@ update_text_cell (ExoIconView *icon_view)
+ }
+ }
+
++
++
+ static void
+ update_pixbuf_cell (ExoIconView *icon_view)
+ {
+@@ -5982,6 +5967,46 @@ exo_icon_view_set_cursor (ExoIconView *icon_view,
+
+
+
++static gboolean
++scroll_delayed (gpointer user_data)
++{
++ ExoIconView *icon_view = user_data;
++ GtkTreePath *path;
++
++ _exo_return_val_if_fail (EXO_IS_ICON_VIEW (icon_view), FALSE);
++
++ /* schedule the scrolling again if the window still isn't realized or
++ * the layouting still is not finished */
++ if (!GTK_WIDGET_REALIZED (GTK_WIDGET (icon_view)) || icon_view->priv->layout_idle_id != 0)
++ return TRUE;
++
++ /* scroll to the previously remembered path (if any) */
++ if (G_UNLIKELY (icon_view->priv->scroll_to_path != NULL))
++ {
++ /* grab the path from the reference and invalidate the reference */
++ path = gtk_tree_row_reference_get_path (icon_view->priv->scroll_to_path);
++ gtk_tree_row_reference_free (icon_view->priv->scroll_to_path);
++ icon_view->priv->scroll_to_path = NULL;
++
++ /* check if the reference was still valid */
++ if (G_LIKELY (path != NULL))
++ {
++ /* try to scroll again */
++ exo_icon_view_scroll_to_path (icon_view, path,
++ icon_view->priv->scroll_to_use_align,
++ icon_view->priv->scroll_to_row_align,
++ icon_view->priv->scroll_to_col_align);
++
++ /* release the path */
++ gtk_tree_path_free (path);
++ }
++ }
++
++ return FALSE;
++}
++
++
++
+ /**
+ * exo_icon_view_scroll_to_path:
+ * @icon_view: A #ExoIconView.
+@@ -6023,6 +6048,10 @@ exo_icon_view_scroll_to_path (ExoIconView *icon_view,
+ /* Delay scrolling if either not realized or pending layout() */
+ if (!GTK_WIDGET_REALIZED (icon_view) || icon_view->priv->layout_idle_id != 0)
+ {
++ /* drop previous scroll idle handler */
++ if (G_UNLIKELY (icon_view->priv->scroll_idle_id != 0))
++ g_source_remove (icon_view->priv->scroll_idle_id);
++
+ /* release the previous scroll_to_path reference */
+ if (G_UNLIKELY (icon_view->priv->scroll_to_path != NULL))
+ gtk_tree_row_reference_free (icon_view->priv->scroll_to_path);
+@@ -6032,6 +6061,11 @@ exo_icon_view_scroll_to_path (ExoIconView *icon_view,
+ icon_view->priv->scroll_to_use_align = use_align;
+ icon_view->priv->scroll_to_row_align = row_align;
+ icon_view->priv->scroll_to_col_align = col_align;
++
++ /* schedule an idle handler to scroll to the given path */
++ icon_view->priv->scroll_idle_id = g_idle_add_full (G_PRIORITY_LOW,
++ scroll_delayed, icon_view,
++ NULL);
+ }
+ else
+ {
Modified: desktop/trunk/exo/debian/patches/series
===================================================================
--- desktop/trunk/exo/debian/patches/series 2009-09-11 22:44:21 UTC (rev 3494)
+++ desktop/trunk/exo/debian/patches/series 2009-09-11 22:59:06 UTC (rev 3495)
@@ -1,2 +1,3 @@
01_fix-exo-csource-manpage.patch
02_fix-exo-open-manpage.patch
+03_fix-scroll-with-csw.patch
More information about the Pkg-xfce-commits
mailing list