[maemo-commits] [maemo-commits] r9303 - in projects/haf/branches/gtk+/maemo-gtk-2-10: . gtk

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Wed Jan 24 16:02:32 EET 2007
Author: mitch
Date: 2007-01-24 16:02:30 +0200 (Wed, 24 Jan 2007)
New Revision: 9303

Modified:
   projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkscrolledwindow.c
Log:
2007-01-24  Michael Natterer  <mitch at imendio.com>

	* gtk/gtkscrolledwindow.c (gtk_scrolled_window_size_allocate):
	port over "keep focussed child visible when size changes".



Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-01-24 14:00:58 UTC (rev 9302)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-01-24 14:02:30 UTC (rev 9303)
@@ -1,5 +1,10 @@
 2007-01-24  Michael Natterer  <mitch at imendio.com>
 
+	* gtk/gtkscrolledwindow.c (gtk_scrolled_window_size_allocate):
+	port over "keep focussed child visible when size changes".
+
+2007-01-24  Michael Natterer  <mitch at imendio.com>
+
 	* gtk/gtkrc.c (gtk_rc_reparse_all_for_settings): port over parsing
 	order change: parse theme and key theme first (makes styles
 	available when parsing with gtk_rc_context_parse_string)

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkscrolledwindow.c
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkscrolledwindow.c	2007-01-24 14:00:58 UTC (rev 9302)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkscrolledwindow.c	2007-01-24 14:02:30 UTC (rev 9303)
@@ -1237,7 +1237,7 @@
       allocation->x += widget->style->xthickness;
       allocation->y += widget->style->ythickness;
     }
-  
+
   allocation->width = MAX (1, (gint)widget->allocation.width - allocation->x * 2);
   allocation->height = MAX (1, (gint)widget->allocation.height - allocation->y * 2);
 
@@ -1249,23 +1249,24 @@
       gtk_widget_get_child_requisition (scrolled_window->vscrollbar,
 					&vscrollbar_requisition);
       is_rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
-  
-      if ((!is_rtl && 
+
+      if ((!is_rtl &&
 	   (priv->real_window_placement == GTK_CORNER_TOP_RIGHT ||
 	    priv->real_window_placement == GTK_CORNER_BOTTOM_RIGHT)) ||
-	  (is_rtl && 
+	  (is_rtl &&
 	   (priv->real_window_placement == GTK_CORNER_TOP_LEFT ||
 	    priv->real_window_placement == GTK_CORNER_BOTTOM_LEFT)))
 	allocation->x += (vscrollbar_requisition.width +  scrollbar_spacing);
 
       allocation->width = MAX (1, allocation->width - (vscrollbar_requisition.width + scrollbar_spacing));
     }
+
   if (scrolled_window->hscrollbar_visible)
     {
       GtkRequisition hscrollbar_requisition;
       gtk_widget_get_child_requisition (scrolled_window->hscrollbar,
-					&hscrollbar_requisition);
-  
+                                        &hscrollbar_requisition);
+
       if (priv->real_window_placement == GTK_CORNER_BOTTOM_LEFT ||
 	  priv->real_window_placement == GTK_CORNER_BOTTOM_RIGHT)
 	allocation->y += (hscrollbar_requisition.height + scrollbar_spacing);
@@ -1274,7 +1275,85 @@
     }
 }
 
+#ifdef MAEMO_CHANGES
+
+static gdouble
+gtk_scrolled_window_get_focus_movement (GtkScrolledWindow *scrolled_window)
+{
+  GtkWidget *focus_child;
+  GtkRange *range;
+  GtkAdjustment *adj;
+  gdouble value, new_value;
+  gint x, y;
+  gint border_width;
+
+  focus_child = GTK_CONTAINER (scrolled_window)->focus_child;
+  if (focus_child == NULL)
+     return 0;
+
+  while (GTK_IS_CONTAINER (focus_child) &&
+        GTK_CONTAINER (focus_child)->focus_child)
+    {
+      focus_child = GTK_CONTAINER (focus_child)->focus_child;
+    }
+
+  if (!gtk_widget_translate_coordinates (focus_child->parent,
+                                         GTK_WIDGET (scrolled_window),
+                                         focus_child->allocation.x,
+                                         focus_child->allocation.y, &x, &y))
+    return 0;
+
+  range = GTK_RANGE (scrolled_window->vscrollbar);
+  adj = range->adjustment;
+  value = gtk_adjustment_get_value (adj);
+
+  border_width = GTK_CONTAINER (scrolled_window)->border_width;
+
+  x -= border_width;
+  y -= border_width;
+
+  if (y < 0)
+    {
+      /* scroll up */
+      new_value = value + y;
+      if (new_value < adj->lower)
+       new_value = adj->lower;
+    }
+  else if (y + focus_child->allocation.height > adj->page_size)
+    {
+      /* scroll down */
+      new_value = value + y + focus_child->allocation.height - adj->page_size;
+      if (new_value > adj->upper - adj->page_size)
+        new_value = adj->upper - adj->page_size;
+    }
+  else
+    {
+      new_value = value;
+    }
+
+  return new_value - value;
+}
+
 static void
+gtk_scrolled_window_scroll_to_focus (GtkScrolledWindow *scrolled_window)
+{
+  GtkAdjustment *adj;
+  gdouble diff;
+
+  diff = gtk_scrolled_window_get_focus_movement (scrolled_window);
+  if (diff != 0)
+    {
+      adj = GTK_RANGE (scrolled_window->vscrollbar)->adjustment;
+
+      gtk_adjustment_set_value (adj, gtk_adjustment_get_value (adj) + diff);
+      gtk_scrolled_window_set_vadjustment (scrolled_window,
+                                          GTK_ADJUSTMENT (adj));
+    }
+}
+
+#endif /* MAEMO_CHANGES */
+
+static void
 gtk_scrolled_window_size_allocate (GtkWidget     *widget,
 				   GtkAllocation *allocation)
 {
@@ -1284,13 +1363,21 @@
   GtkAllocation relative_allocation;
   GtkAllocation child_allocation;
   gint scrollbar_spacing;
-  
+#ifdef MAEMO_CHANGES
+  gboolean is_focus_visible;
+#endif /* MAEMO_CHANGES */
+
   g_return_if_fail (GTK_IS_SCROLLED_WINDOW (widget));
   g_return_if_fail (allocation != NULL);
 
   scrolled_window = GTK_SCROLLED_WINDOW (widget);
   bin = GTK_BIN (scrolled_window);
 
+#ifdef MAEMO_CHANGES
+  is_focus_visible =
+    gtk_scrolled_window_get_focus_movement (scrolled_window) == 0;
+#endif /* MAEMO_CHANGES */
+
   scrollbar_spacing = _gtk_scrolled_window_get_scrollbar_spacing (scrolled_window);
 
   priv = GTK_SCROLLED_WINDOW_GET_PRIVATE (scrolled_window);
@@ -1426,6 +1513,11 @@
 	}
 
       gtk_widget_size_allocate (scrolled_window->vscrollbar, &child_allocation);
+
+#ifdef MAEMO_CHANGES
+      if (is_focus_visible)
+        gtk_scrolled_window_scroll_to_focus (scrolled_window);
+#endif /* MAEMO_CHANGES */
     }
   else if (GTK_WIDGET_VISIBLE (scrolled_window->vscrollbar))
     gtk_widget_hide (scrolled_window->vscrollbar);


More information about the maemo-commits mailing list