]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkscrolledwindow.c
Fix a C99ism
[~andy/gtk] / gtk / gtkscrolledwindow.c
index cc78baaa651e155d26b293522da20705610a6e3e..7eafb767a620168700ee1b58de6f019572cfbfac 100644 (file)
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
  */
 
+#include <config.h>
+#include <math.h>
 #include <gdk/gdkkeysyms.h>
 #include "gtkbindings.h"
 #include "gtkmarshalers.h"
 #include "gtkscrolledwindow.h"
+#include "gtkprivate.h"
 #include "gtkintl.h"
+#include "gtkalias.h"
 
 
 /* scrolled window policy and size requisition handling:
@@ -154,7 +158,7 @@ gtk_scrolled_window_get_type (void)
       };
 
       scrolled_window_type =
-       g_type_register_static (GTK_TYPE_BIN, "GtkScrolledWindow",
+       g_type_register_static (GTK_TYPE_BIN, I_("GtkScrolledWindow"),
                                &scrolled_window_info, 0);
     }
 
@@ -232,62 +236,62 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
   g_object_class_install_property (gobject_class,
                                   PROP_HADJUSTMENT,
                                   g_param_spec_object ("hadjustment",
-                                                       _("Horizontal Adjustment"),
-                                                       _("The GtkAdjustment for the horizontal position"),
+                                                       P_("Horizontal Adjustment"),
+                                                       P_("The GtkAdjustment for the horizontal position"),
                                                        GTK_TYPE_ADJUSTMENT,
-                                                       G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+                                                       GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
   g_object_class_install_property (gobject_class,
                                   PROP_VADJUSTMENT,
                                   g_param_spec_object ("vadjustment",
-                                                       _("Vertical Adjustment"),
-                                                       _("The GtkAdjustment for the vertical position"),
+                                                       P_("Vertical Adjustment"),
+                                                       P_("The GtkAdjustment for the vertical position"),
                                                        GTK_TYPE_ADJUSTMENT,
-                                                       G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
+                                                       GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT));
   g_object_class_install_property (gobject_class,
                                    PROP_HSCROLLBAR_POLICY,
-                                   g_param_spec_enum ("hscrollbar_policy",
-                                                      _("Horizontal Scrollbar Policy"),
-                                                      _("When the horizontal scrollbar is displayed"),
+                                   g_param_spec_enum ("hscrollbar-policy",
+                                                      P_("Horizontal Scrollbar Policy"),
+                                                      P_("When the horizontal scrollbar is displayed"),
                                                      GTK_TYPE_POLICY_TYPE,
                                                      GTK_POLICY_ALWAYS,
-                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                                      GTK_PARAM_READABLE | GTK_PARAM_WRITABLE));
   g_object_class_install_property (gobject_class,
                                    PROP_VSCROLLBAR_POLICY,
-                                   g_param_spec_enum ("vscrollbar_policy",
-                                                      _("Vertical Scrollbar Policy"),
-                                                      _("When the vertical scrollbar is displayed"),
+                                   g_param_spec_enum ("vscrollbar-policy",
+                                                      P_("Vertical Scrollbar Policy"),
+                                                      P_("When the vertical scrollbar is displayed"),
                                                      GTK_TYPE_POLICY_TYPE,
                                                      GTK_POLICY_ALWAYS,
-                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                                      GTK_PARAM_READABLE | GTK_PARAM_WRITABLE));
 
   g_object_class_install_property (gobject_class,
                                    PROP_WINDOW_PLACEMENT,
-                                   g_param_spec_enum ("window_placement",
-                                                      _("Window Placement"),
-                                                      _("Where the contents are located with respect to the scrollbars"),
+                                   g_param_spec_enum ("window-placement",
+                                                      P_("Window Placement"),
+                                                      P_("Where the contents are located with respect to the scrollbars"),
                                                      GTK_TYPE_CORNER_TYPE,
                                                      GTK_CORNER_TOP_LEFT,
-                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                                      GTK_PARAM_READABLE | GTK_PARAM_WRITABLE));
   g_object_class_install_property (gobject_class,
                                    PROP_SHADOW_TYPE,
-                                   g_param_spec_enum ("shadow_type",
-                                                      _("Shadow Type"),
-                                                      _("Style of bevel around the contents"),
+                                   g_param_spec_enum ("shadow-type",
+                                                      P_("Shadow Type"),
+                                                      P_("Style of bevel around the contents"),
                                                      GTK_TYPE_SHADOW_TYPE,
                                                      GTK_SHADOW_NONE,
-                                                      G_PARAM_READABLE | G_PARAM_WRITABLE));
+                                                      GTK_PARAM_READABLE | GTK_PARAM_WRITABLE));
 
   gtk_widget_class_install_style_property (widget_class,
-                                          g_param_spec_int ("scrollbar_spacing",
-                                                            _("Scrollbar spacing"),
-                                                            _("Number of pixels between the scrollbars and the scrolled window"),
+                                          g_param_spec_int ("scrollbar-spacing",
+                                                            P_("Scrollbar spacing"),
+                                                            P_("Number of pixels between the scrollbars and the scrolled window"),
                                                             0,
                                                             G_MAXINT,
                                                             DEFAULT_SCROLLBAR_SPACING,
-                                                            G_PARAM_READABLE));
+                                                            GTK_PARAM_READABLE));
 
   signals[SCROLL_CHILD] =
-    g_signal_new ("scroll_child",
+    g_signal_new (I_("scroll_child"),
                   G_TYPE_FROM_CLASS (object_class),
                   G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                   G_STRUCT_OFFSET (GtkScrolledWindowClass, scroll_child),
@@ -297,7 +301,7 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
                   GTK_TYPE_SCROLL_TYPE,
                  G_TYPE_BOOLEAN);
   signals[MOVE_FOCUS_OUT] =
-    g_signal_new ("move_focus_out",
+    g_signal_new (I_("move_focus_out"),
                   G_TYPE_FROM_CLASS (object_class),
                   G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
                   G_STRUCT_OFFSET (GtkScrolledWindowClass, move_focus_out),
@@ -373,7 +377,7 @@ gtk_scrolled_window_set_hadjustment (GtkScrolledWindow *scrolled_window,
   if (hadjustment)
     g_return_if_fail (GTK_IS_ADJUSTMENT (hadjustment));
   else
-    hadjustment = (GtkAdjustment*) gtk_object_new (GTK_TYPE_ADJUSTMENT, NULL);
+    hadjustment = (GtkAdjustment*) g_object_new (GTK_TYPE_ADJUSTMENT, NULL);
 
   bin = GTK_BIN (scrolled_window);
 
@@ -427,7 +431,7 @@ gtk_scrolled_window_set_vadjustment (GtkScrolledWindow *scrolled_window,
   if (vadjustment)
     g_return_if_fail (GTK_IS_ADJUSTMENT (vadjustment));
   else
-    vadjustment = (GtkAdjustment*) gtk_object_new (GTK_TYPE_ADJUSTMENT, NULL);
+    vadjustment = (GtkAdjustment*) g_object_new (GTK_TYPE_ADJUSTMENT, NULL);
 
   bin = GTK_BIN (scrolled_window);
 
@@ -491,6 +495,44 @@ gtk_scrolled_window_get_vadjustment (GtkScrolledWindow *scrolled_window)
          NULL);
 }
 
+/**
+ * gtk_scrolled_window_get_hscrollbar:
+ * @scrolled_window: a #GtkScrolledWindow
+ * 
+ * Returns the horizontal scrollbar of @scrolled_window.
+ *
+ * Returns: the horizontal scrollbar of the scrolled window, or 
+ *  %NULL if it does not have one.
+ *
+ * Since: 2.8
+ */
+GtkWidget*
+gtk_scrolled_window_get_hscrollbar (GtkScrolledWindow *scrolled_window)
+{
+  g_return_val_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window), NULL);
+  
+  return scrolled_window->hscrollbar;
+}
+
+/**
+ * gtk_scrolled_window_get_vscrollbar:
+ * @scrolled_window: a #GtkScrolledWindow
+ * 
+ * Returns the vertical scrollbar of @scrolled_window.
+ *
+ * Returns: the vertical scrollbar of the scrolled window, or
+ *  %NULL if it does not have one.
+ *
+ * Since: 2.8
+ */
+GtkWidget*
+gtk_scrolled_window_get_vscrollbar (GtkScrolledWindow *scrolled_window)
+{
+  g_return_val_if_fail (GTK_IS_SCROLLED_WINDOW (scrolled_window), NULL);
+
+  return scrolled_window->vscrollbar;
+}
+
 void
 gtk_scrolled_window_set_policy (GtkScrolledWindow *scrolled_window,
                                GtkPolicyType      hscrollbar_policy,
@@ -509,8 +551,8 @@ gtk_scrolled_window_set_policy (GtkScrolledWindow *scrolled_window,
       gtk_widget_queue_resize (GTK_WIDGET (scrolled_window));
 
       g_object_freeze_notify (object);
-      g_object_notify (object, "hscrollbar_policy");
-      g_object_notify (object, "vscrollbar_policy");
+      g_object_notify (object, "hscrollbar-policy");
+      g_object_notify (object, "vscrollbar-policy");
       g_object_thaw_notify (object);
     }
 }
@@ -549,7 +591,7 @@ gtk_scrolled_window_set_placement (GtkScrolledWindow *scrolled_window,
 
       gtk_widget_queue_resize (GTK_WIDGET (scrolled_window));
       
-      g_object_notify (G_OBJECT (scrolled_window), "window_placement");
+      g_object_notify (G_OBJECT (scrolled_window), "window-placement");
     }
 }
 
@@ -595,7 +637,7 @@ gtk_scrolled_window_set_shadow_type (GtkScrolledWindow *scrolled_window,
 
       gtk_widget_queue_resize (GTK_WIDGET (scrolled_window));
 
-      g_object_notify (G_OBJECT (scrolled_window), "shadow_type");
+      g_object_notify (G_OBJECT (scrolled_window), "shadow-type");
     }
 }
 
@@ -1029,11 +1071,18 @@ gtk_scrolled_window_relative_allocation (GtkWidget     *widget,
   if (scrolled_window->vscrollbar_visible)
     {
       GtkRequisition vscrollbar_requisition;
+      gboolean is_rtl;
+
       gtk_widget_get_child_requisition (scrolled_window->vscrollbar,
                                        &vscrollbar_requisition);
+      is_rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
   
-      if (scrolled_window->window_placement == GTK_CORNER_TOP_RIGHT ||
-         scrolled_window->window_placement == GTK_CORNER_BOTTOM_RIGHT)
+      if ((!is_rtl && 
+          (scrolled_window->window_placement == GTK_CORNER_TOP_RIGHT ||
+           scrolled_window->window_placement == GTK_CORNER_BOTTOM_RIGHT)) ||
+         (is_rtl && 
+          (scrolled_window->window_placement == GTK_CORNER_TOP_LEFT ||
+           scrolled_window->window_placement == GTK_CORNER_BOTTOM_LEFT)))
        allocation->x += (vscrollbar_requisition.width +  scrollbar_spacing);
 
       allocation->width = MAX (1, allocation->width - (vscrollbar_requisition.width + scrollbar_spacing));
@@ -1170,8 +1219,12 @@ gtk_scrolled_window_size_allocate (GtkWidget     *widget,
       gtk_widget_get_child_requisition (scrolled_window->vscrollbar,
                                        &vscrollbar_requisition);
 
-      if (scrolled_window->window_placement == GTK_CORNER_TOP_LEFT ||
-         scrolled_window->window_placement == GTK_CORNER_BOTTOM_LEFT)
+      if ((gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL && 
+          (scrolled_window->window_placement == GTK_CORNER_TOP_RIGHT ||
+           scrolled_window->window_placement == GTK_CORNER_BOTTOM_RIGHT)) ||
+         (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_LTR && 
+          (scrolled_window->window_placement == GTK_CORNER_TOP_LEFT ||
+           scrolled_window->window_placement == GTK_CORNER_BOTTOM_LEFT)))
        child_allocation.x = (relative_allocation.x +
                              relative_allocation.width +
                              scrollbar_spacing +
@@ -1215,14 +1268,12 @@ gtk_scrolled_window_scroll_event (GtkWidget *widget,
   if (range && GTK_WIDGET_VISIBLE (range))
     {
       GtkAdjustment *adj = GTK_RANGE (range)->adjustment;
-      gdouble new_value;
+      gdouble delta, new_value;
 
-      if (event->direction == GDK_SCROLL_UP || event->direction == GDK_SCROLL_LEFT)
-       new_value = adj->value - adj->page_increment / 2;
-      else
-       new_value = adj->value + adj->page_increment / 2;
+      delta = _gtk_range_get_wheel_delta (GTK_RANGE (range), event->direction);
 
-      new_value = CLAMP (new_value, adj->lower, adj->upper - adj->page_size);
+      new_value = CLAMP (adj->value + delta, adj->lower, adj->upper - adj->page_size);
+      
       gtk_adjustment_set_value (adj, new_value);
 
       return TRUE;
@@ -1400,9 +1451,12 @@ _gtk_scrolled_window_get_scrollbar_spacing (GtkScrolledWindow *scrolled_window)
       gint scrollbar_spacing;
       
       gtk_widget_style_get (GTK_WIDGET (scrolled_window),
-                           "scrollbar_spacing", &scrollbar_spacing,
+                           "scrollbar-spacing", &scrollbar_spacing,
                            NULL);
 
       return scrollbar_spacing;
     }
 }
+
+#define __GTK_SCROLLED_WINDOW_C__
+#include "gtkaliasdef.c"