X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkscalebutton.c;h=f10bb0308d7787a2ad7e65667520ca9f2e177ff4;hb=a41b73fbc71f613e4ca90ae8b9dd3bd317d026d6;hp=2de9de9e635cb231779425b67a3accf153cc3d2b;hpb=42f480a537da89eac587a5a67fbf64ab248cd931;p=~andy%2Fgtk diff --git a/gtk/gtkscalebutton.c b/gtk/gtkscalebutton.c index 2de9de9e6..f10bb0308 100644 --- a/gtk/gtkscalebutton.c +++ b/gtk/gtkscalebutton.c @@ -21,9 +21,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * License along with this library. If not, see . */ /* @@ -35,6 +33,8 @@ #include "config.h" +#include "gtkscalebutton.h" + #ifndef _WIN32 #define _GNU_SOURCE #endif @@ -42,9 +42,7 @@ #include #include -#include -#include - +#include "gtkadjustment.h" #include "gtkbindings.h" #include "gtkframe.h" #include "gtkmain.h" @@ -52,12 +50,12 @@ #include "gtkorientable.h" #include "gtkprivate.h" #include "gtkscale.h" -#include "gtkscalebutton.h" #include "gtkstock.h" -#include "gtkvbox.h" +#include "gtkbox.h" #include "gtkwindow.h" - +#include "gtktypebuiltins.h" #include "gtkintl.h" +#include "a11y/gtkscalebuttonaccessible.h" /** * SECTION:gtkscalebutton @@ -346,6 +344,8 @@ gtk_scale_button_class_init (GtkScaleButtonClass *klass) "popup", 0); gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "popdown", 0); + + gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_SCALE_BUTTON_ACCESSIBLE); } static void @@ -390,7 +390,7 @@ gtk_scale_button_init (GtkScaleButton *button) gtk_container_add (GTK_CONTAINER (priv->dock), frame); /* box for scale and +/- buttons */ - priv->box = gtk_vbox_new (FALSE, 0); + priv->box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0); gtk_container_add (GTK_CONTAINER (frame), priv->box); /* + */ @@ -411,12 +411,14 @@ gtk_scale_button_init (GtkScaleButton *button) G_CALLBACK (cb_button_release), button); gtk_box_pack_end (GTK_BOX (priv->box), priv->minus_button, FALSE, FALSE, 0); - priv->adjustment = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 100.0, 2, 20, 0)); + priv->adjustment = gtk_adjustment_new (0.0, 0.0, 100.0, 2, 20, 0); g_object_ref_sink (priv->adjustment); /* the scale */ priv->scale = gtk_scale_button_scale_new (button); gtk_container_add (GTK_CONTAINER (priv->box), priv->scale); + + gtk_widget_add_events (GTK_WIDGET (button), GDK_SCROLL_MASK); } static GObject * @@ -562,8 +564,9 @@ gtk_scale_button_dispose (GObject *object) * @max: the maximum value of the scale (usually 100) * @step: the stepping of value when a scroll-wheel event, * or up/down arrow event occurs (usually 2) - * @icons: (allow-none): a %NULL-terminated array of icon names, or %NULL if - * you want to set the list later with gtk_scale_button_set_icons() + * @icons: (allow-none) (array zero-terminated=1): a %NULL-terminated + * array of icon names, or %NULL if you want to set the list + * later with gtk_scale_button_set_icons() * * Creates a #GtkScaleButton, with a range between @min and @max, with * a stepping of @step. @@ -580,12 +583,12 @@ gtk_scale_button_new (GtkIconSize size, const gchar **icons) { GtkScaleButton *button; - GtkAdjustment *adj; + GtkAdjustment *adjustment; - adj = gtk_adjustment_new (min, min, max, step, 10 * step, 0); + adjustment = gtk_adjustment_new (min, min, max, step, 10 * step, 0); button = g_object_new (GTK_TYPE_SCALE_BUTTON, - "adjustment", adj, + "adjustment", adjustment, "icons", icons, "size", size, NULL); @@ -643,7 +646,7 @@ gtk_scale_button_set_value (GtkScaleButton *button, /** * gtk_scale_button_set_icons: * @button: a #GtkScaleButton - * @icons: a %NULL-terminated array of icon names + * @icons: (array zero-terminated=1): a %NULL-terminated array of icon names * * Sets the icons to be used by the scale button. * For details, see the #GtkScaleButton:icons property. @@ -704,8 +707,9 @@ gtk_scale_button_set_adjustment (GtkScaleButton *button, GtkAdjustment *adjustment) { g_return_if_fail (GTK_IS_SCALE_BUTTON (button)); + if (!adjustment) - adjustment = (GtkAdjustment*) gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0); + adjustment = gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0); else g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); @@ -836,12 +840,12 @@ gtk_scale_button_scroll (GtkWidget *widget, { GtkScaleButton *button; GtkScaleButtonPrivate *priv; - GtkAdjustment *adj; + GtkAdjustment *adjustment; gdouble d; button = GTK_SCALE_BUTTON (widget); priv = button->priv; - adj = priv->adjustment; + adjustment = priv->adjustment; if (event->type != GDK_SCROLL) return FALSE; @@ -849,15 +853,15 @@ gtk_scale_button_scroll (GtkWidget *widget, d = gtk_scale_button_get_value (button); if (event->direction == GDK_SCROLL_UP) { - d += adj->step_increment; - if (d > adj->upper) - d = adj->upper; + d += gtk_adjustment_get_step_increment (adjustment); + if (d > gtk_adjustment_get_upper (adjustment)) + d = gtk_adjustment_get_upper (adjustment); } else { - d -= adj->step_increment; - if (d < adj->lower) - d = adj->lower; + d -= gtk_adjustment_get_step_increment (adjustment); + if (d < gtk_adjustment_get_lower (adjustment)) + d = gtk_adjustment_get_lower (adjustment); } gtk_scale_button_set_value (button, d); @@ -871,7 +875,7 @@ gtk_scale_button_screen_changed (GtkWidget *widget, GtkScaleButton *button = (GtkScaleButton *) widget; GtkScaleButtonPrivate *priv; GdkScreen *screen; - GValue value = { 0, }; + GValue value = G_VALUE_INIT; if (gtk_widget_has_screen (widget) == FALSE) return; @@ -899,11 +903,10 @@ gtk_scale_popup (GtkWidget *widget, GtkAllocation allocation, dock_allocation, scale_allocation; GtkScaleButton *button; GtkScaleButtonPrivate *priv; - GtkAdjustment *adj; + GtkAdjustment *adjustment; gint x, y, m, dx, dy, sx, sy, startoff; gint min_slider_size; gdouble v; - GdkDisplay *display; GdkScreen *screen; gboolean is_moved; GdkDevice *device, *keyboard, *pointer; @@ -911,9 +914,8 @@ gtk_scale_popup (GtkWidget *widget, is_moved = FALSE; button = GTK_SCALE_BUTTON (widget); priv = button->priv; - adj = priv->adjustment; + adjustment = priv->adjustment; - display = gtk_widget_get_display (widget); screen = gtk_widget_get_screen (widget); gtk_widget_get_allocation (widget, &allocation); @@ -948,7 +950,7 @@ gtk_scale_popup (GtkWidget *widget, priv->timeout = TRUE; /* position (needs widget to be shown already) */ - v = gtk_scale_button_get_value (button) / (adj->upper - adj->lower); + v = gtk_scale_button_get_value (button) / (gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_lower (adjustment)); min_slider_size = gtk_range_get_min_slider_size (GTK_RANGE (priv->scale)); if (priv->orientation == GTK_ORIENTATION_VERTICAL) @@ -985,7 +987,7 @@ gtk_scale_popup (GtkWidget *widget, monitor = gdk_screen_get_monitor_at_point (screen, button_event->x_root, button_event->y_root); - gdk_screen_get_monitor_geometry (screen, monitor, &rect); + gdk_screen_get_monitor_workarea (screen, monitor, &rect); if (priv->orientation == GTK_ORIENTATION_VERTICAL) y += button_event->y; @@ -1026,7 +1028,7 @@ gtk_scale_popup (GtkWidget *widget, device = gdk_event_get_device (event); - if (device->source == GDK_SOURCE_KEYBOARD) + if (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) { keyboard = device; pointer = gdk_device_get_associated_device (device); @@ -1146,9 +1148,8 @@ gtk_scale_button_key_release (GtkWidget *widget, * either the dock, or the scale itself */ static void gtk_scale_button_grab_notify (GtkScaleButton *button, - gboolean was_grabbed) + gboolean was_grabbed) { - GdkDisplay *display; GtkScaleButtonPrivate *priv; GtkWidget *toplevel, *grab_widget; GtkWindowGroup *group; @@ -1172,7 +1173,6 @@ gtk_scale_button_grab_notify (GtkScaleButton *button, gtk_widget_is_ancestor (grab_widget, priv->dock)) return; - display = gtk_widget_get_display (priv->dock); gdk_device_ungrab (priv->grab_keyboard, GDK_CURRENT_TIME); gdk_device_ungrab (priv->grab_pointer, GDK_CURRENT_TIME); gtk_device_grab_remove (priv->dock, priv->grab_pointer); @@ -1194,7 +1194,7 @@ cb_button_timeout (gpointer user_data) { GtkScaleButton *button; GtkScaleButtonPrivate *priv; - GtkAdjustment *adj; + GtkAdjustment *adjustment; gdouble val; gboolean res = TRUE; @@ -1204,19 +1204,19 @@ cb_button_timeout (gpointer user_data) if (priv->click_id == 0) return FALSE; - adj = priv->adjustment; + adjustment = priv->adjustment; val = gtk_scale_button_get_value (button); val += priv->direction; - if (val <= adj->lower) + if (val <= gtk_adjustment_get_lower (adjustment)) { res = FALSE; - val = adj->lower; + val = gtk_adjustment_get_lower (adjustment); } - else if (val > adj->upper) + else if (val > gtk_adjustment_get_upper (adjustment)) { res = FALSE; - val = adj->upper; + val = gtk_adjustment_get_upper (adjustment); } gtk_scale_button_set_value (button, val); @@ -1236,19 +1236,19 @@ cb_button_press (GtkWidget *widget, { GtkScaleButton *button; GtkScaleButtonPrivate *priv; - GtkAdjustment *adj; + GtkAdjustment *adjustment; button = GTK_SCALE_BUTTON (user_data); priv = button->priv; - adj = priv->adjustment; + adjustment = priv->adjustment; if (priv->click_id != 0) g_source_remove (priv->click_id); if (widget == priv->plus_button) - priv->direction = fabs (adj->page_increment); + priv->direction = fabs (gtk_adjustment_get_page_increment (adjustment)); else - priv->direction = - fabs (adj->page_increment); + priv->direction = - fabs (gtk_adjustment_get_page_increment (adjustment)); priv->click_id = gdk_threads_add_timeout (priv->click_timeout, cb_button_timeout, @@ -1300,22 +1300,18 @@ cb_dock_grab_broken_event (GtkWidget *widget, return FALSE; } -/* - * Scale callbacks. - */ +/* Scale callbacks */ static void gtk_scale_button_release_grab (GtkScaleButton *button, - GdkEventButton *event) + GdkEventButton *event) { GdkEventButton *e; - GdkDisplay *display; GtkScaleButtonPrivate *priv; priv = button->priv; /* ungrab focus */ - display = gtk_widget_get_display (GTK_WIDGET (button)); gdk_device_ungrab (priv->grab_keyboard, event->time); gdk_device_ungrab (priv->grab_pointer, event->time); gtk_device_grab_remove (priv->dock, priv->grab_pointer); @@ -1356,13 +1352,11 @@ gtk_scale_button_popdown (GtkWidget *widget) { GtkScaleButton *button; GtkScaleButtonPrivate *priv; - GdkDisplay *display; button = GTK_SCALE_BUTTON (widget); priv = button->priv; /* ungrab focus */ - display = gtk_widget_get_display (widget); gdk_device_ungrab (priv->grab_keyboard, GDK_CURRENT_TIME); gdk_device_ungrab (priv->grab_pointer, GDK_CURRENT_TIME); gtk_device_grab_remove (priv->dock, priv->grab_pointer); @@ -1429,6 +1423,8 @@ static gboolean gtk_scale_button_scale_press (GtkWidget *widget, static gboolean gtk_scale_button_scale_release (GtkWidget *widget, GdkEventButton *event); +GType _gtk_scale_button_scale_get_type (void); + G_DEFINE_TYPE (GtkScaleButtonScale, _gtk_scale_button_scale, GTK_TYPE_SCALE) static void @@ -1531,8 +1527,7 @@ static void gtk_scale_button_update_icon (GtkScaleButton *button) { GtkScaleButtonPrivate *priv; - GtkRange *range; - GtkAdjustment *adj; + GtkAdjustment *adjustment; gdouble value; const gchar *name; guint num_icons; @@ -1542,8 +1537,8 @@ gtk_scale_button_update_icon (GtkScaleButton *button) if (!priv->icon_list || priv->icon_list[0] == '\0') { gtk_image_set_from_stock (GTK_IMAGE (priv->image), - GTK_STOCK_MISSING_IMAGE, - priv->size); + GTK_STOCK_MISSING_IMAGE, + priv->size); return; } @@ -1553,37 +1548,37 @@ gtk_scale_button_update_icon (GtkScaleButton *button) if (num_icons == 1) { gtk_image_set_from_icon_name (GTK_IMAGE (priv->image), - priv->icon_list[0], - priv->size); + priv->icon_list[0], + priv->size); return; } - range = GTK_RANGE (priv->scale); - adj = priv->adjustment; + adjustment = priv->adjustment; value = gtk_scale_button_get_value (button); /* The 2-icons special case */ if (num_icons == 2) { gdouble limit; - limit = (adj->upper - adj->lower) / 2 + adj->lower; + + limit = (gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_lower (adjustment)) / 2 + gtk_adjustment_get_lower (adjustment); if (value < limit) - name = priv->icon_list[0]; + name = priv->icon_list[0]; else - name = priv->icon_list[1]; + name = priv->icon_list[1]; gtk_image_set_from_icon_name (GTK_IMAGE (priv->image), - name, - priv->size); + name, + priv->size); return; } /* With 3 or more icons */ - if (value == adj->lower) + if (value == gtk_adjustment_get_lower (adjustment)) { name = priv->icon_list[0]; } - else if (value == adj->upper) + else if (value == gtk_adjustment_get_upper (adjustment)) { name = priv->icon_list[1]; } @@ -1592,15 +1587,15 @@ gtk_scale_button_update_icon (GtkScaleButton *button) gdouble step; guint i; - step = (adj->upper - adj->lower) / (num_icons - 2); - i = (guint) ((value - adj->lower) / step) + 2; + step = (gtk_adjustment_get_upper (adjustment) - gtk_adjustment_get_lower (adjustment)) / (num_icons - 2); + i = (guint) ((value - gtk_adjustment_get_lower (adjustment)) / step) + 2; g_assert (i < num_icons); name = priv->icon_list[i]; } gtk_image_set_from_icon_name (GTK_IMAGE (priv->image), - name, - priv->size); + name, + priv->size); } static void