static void eog_thumb_nav_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec) { EogThumbNav *nav = EOG_THUMB_NAV (object); switch (property_id) { case PROP_SHOW_BUTTONS: eog_thumb_nav_set_show_buttons (nav, g_value_get_boolean (value)); break; case PROP_THUMB_VIEW: nav->priv->thumbview = GTK_WIDGET (g_value_get_object (value)); break; case PROP_MODE: eog_thumb_nav_set_mode (nav, g_value_get_int (value)); break; } }
static gboolean eog_thumb_nav_scroll_event (GtkWidget *widget, GdkEventScroll *event, gpointer user_data) { EogThumbNav *nav = EOG_THUMB_NAV (user_data); gint inc = EOG_THUMB_NAV_SCROLL_INC * 3; gdouble value, upper, page_size, delta_x, delta_y; gboolean smooth; nav->priv->adj = nav->priv->vertical ? nav->priv->vadj : nav->priv->hadj; switch (event->direction) { #if GTK_CHECK_VERSION (3, 3, 18) /* Handle smooth scroll events from mouse wheels, bug 672311. */ case GDK_SCROLL_SMOOTH: smooth = gdk_event_get_scroll_deltas ((const GdkEvent *) event, &delta_x, &delta_y); /* Pass through non-mouse wheel events. */ if (G_UNLIKELY (!smooth) || delta_x != 0.0 || fabs (delta_y) != 1.0) return FALSE; inc *= (gint) delta_y; break; #endif case GDK_SCROLL_UP: case GDK_SCROLL_LEFT: inc *= -1; break; case GDK_SCROLL_DOWN: case GDK_SCROLL_RIGHT: break; default: g_assert_not_reached (); return FALSE; } value = gtk_adjustment_get_value (nav->priv->adj); if (inc < 0) gtk_adjustment_set_value (nav->priv->adj, MAX (0, value + inc)); else { upper = gtk_adjustment_get_upper (nav->priv->adj); page_size = gtk_adjustment_get_page_size (nav->priv->adj); gtk_adjustment_set_value (nav->priv->adj, MIN (upper - page_size, value + inc)); } gtk_adjustment_value_changed (nav->priv->adj); return TRUE; }
static gboolean eog_thumb_nav_scroll_event (GtkWidget *widget, GdkEventScroll *event, gpointer user_data) { EogThumbNav *nav = EOG_THUMB_NAV (user_data); gint inc = EOG_THUMB_NAV_SCROLL_INC * 3; if (nav->priv->mode != EOG_THUMB_NAV_MODE_ONE_ROW) return FALSE; switch (event->direction) { case GDK_SCROLL_UP: case GDK_SCROLL_LEFT: inc *= -1; break; case GDK_SCROLL_DOWN: case GDK_SCROLL_RIGHT: break; #if GTK_CHECK_VERSION (3, 3, 18) case GDK_SCROLL_SMOOTH: { /* Compatibility code to catch smooth events from mousewheels */ gdouble x_delta, y_delta; gboolean set = gdk_event_get_scroll_deltas ((GdkEvent*)event, &x_delta, &y_delta); /* Propagate horizontal smooth scroll events further, as well as non-mousewheel events. */ if (G_UNLIKELY (!set) || x_delta != 0.0 || fabs(y_delta) != 1.0) return FALSE; /* The y_delta is either +1.0 or -1.0 here */ inc *= (gint) y_delta; } break; #endif default: g_assert_not_reached (); return FALSE; } if (inc < 0) gtk_adjustment_set_value (nav->priv->adj, MAX (0, gtk_adjustment_get_value (nav->priv->adj) + inc)); else gtk_adjustment_set_value (nav->priv->adj, MIN (gtk_adjustment_get_upper (nav->priv->adj) - gtk_adjustment_get_page_size (nav->priv->adj), gtk_adjustment_get_value (nav->priv->adj) + inc)); return TRUE; }
static gboolean eog_thumb_nav_scroll_step (gpointer user_data) { EogThumbNav *nav = EOG_THUMB_NAV (user_data); gint delta; gdouble value, upper, page_size; if (nav->priv->scroll_pos < 10) delta = EOG_THUMB_NAV_SCROLL_INC; else if (nav->priv->scroll_pos < 20) delta = EOG_THUMB_NAV_SCROLL_INC * 2; else if (nav->priv->scroll_pos < 30) delta = EOG_THUMB_NAV_SCROLL_INC * 2 + 5; else delta = EOG_THUMB_NAV_SCROLL_INC * 2 + 12; if (!nav->priv->scroll_dir) delta *= -1; g_object_get (nav->priv->adj, "value", &value, "upper", &upper, "page_size", &page_size, NULL); if ((gint) (value + (gdouble) delta) >= 0 && (gint) (value + (gdouble) delta) <= upper - page_size) { gtk_adjustment_set_value (nav->priv->adj, value + (gdouble) delta); nav->priv->scroll_pos++; gtk_adjustment_value_changed (nav->priv->adj); } else { if (delta > 0) gtk_adjustment_set_value (nav->priv->adj, upper - page_size); else gtk_adjustment_set_value (nav->priv->adj, 0); nav->priv->scroll_pos = 0; gtk_adjustment_value_changed (nav->priv->adj); return G_SOURCE_REMOVE; } return G_SOURCE_CONTINUE; }
static void eog_thumb_nav_adj_changed (GtkAdjustment *adj, gpointer user_data) { EogThumbNav *nav; EogThumbNavPrivate *priv; gboolean ltr; nav = EOG_THUMB_NAV (user_data); priv = EOG_THUMB_NAV_GET_PRIVATE (nav); ltr = gtk_widget_get_direction (priv->sw) == GTK_TEXT_DIR_LTR; gtk_widget_set_sensitive (ltr ? priv->button_right : priv->button_left, gtk_adjustment_get_value (adj) < gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj)); }
static GObject * eog_thumb_nav_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_params) { GObject *object; EogThumbNavPrivate *priv; object = G_OBJECT_CLASS (eog_thumb_nav_parent_class)->constructor (type, n_construct_properties, construct_params); priv = EOG_THUMB_NAV (object)->priv; if (priv->thumbview != NULL) { gtk_container_add (GTK_CONTAINER (priv->sw), priv->thumbview); gtk_widget_show_all (priv->sw); } return object; }
static void eog_thumb_nav_get_property (GObject *object, guint property_id, GValue *value, GParamSpec *pspec) { EogThumbNav *nav = EOG_THUMB_NAV (object); switch (property_id) { case PROP_SHOW_BUTTONS: g_value_set_boolean (value, eog_thumb_nav_get_show_buttons (nav)); break; case PROP_THUMB_VIEW: g_value_set_object (value, nav->priv->thumbview); break; } }
static void eog_thumb_nav_vadj_changed (GtkAdjustment *vadj, gpointer user_data) { EogThumbNav *nav; EogThumbNavPrivate *priv; gdouble value, upper, page_size; nav = EOG_THUMB_NAV (user_data); priv = EOG_THUMB_NAV_GET_PRIVATE (nav); g_object_get (vadj, "value", &value, "upper", &upper, "page_size", &page_size, NULL); gtk_widget_set_sensitive (priv->button_up, value > 0); gtk_widget_set_sensitive (priv->button_down, value < upper - page_size); }
static void eog_thumb_nav_hadj_changed (GtkAdjustment *hadj, gpointer user_data) { EogThumbNav *nav; EogThumbNavPrivate *priv; gboolean ltr; gdouble value, upper, page_size; nav = EOG_THUMB_NAV (user_data); priv = EOG_THUMB_NAV_GET_PRIVATE (nav); ltr = gtk_widget_get_direction (priv->sw) == GTK_TEXT_DIR_LTR; g_object_get (hadj, "value", &value, "upper", &upper, "page_size", &page_size, NULL); gtk_widget_set_sensitive (ltr ? priv->button_right : priv->button_left, value < upper - page_size); }
static gboolean eog_thumb_nav_scroll_step (gpointer user_data) { EogThumbNav *nav = EOG_THUMB_NAV (user_data); GtkAdjustment *adj = nav->priv->adj; gint delta; if (nav->priv->scroll_pos < 10) delta = EOG_THUMB_NAV_SCROLL_INC; else if (nav->priv->scroll_pos < 20) delta = EOG_THUMB_NAV_SCROLL_INC * 2; else if (nav->priv->scroll_pos < 30) delta = EOG_THUMB_NAV_SCROLL_INC * 2 + 5; else delta = EOG_THUMB_NAV_SCROLL_INC * 2 + 12; if (!nav->priv->scroll_dir) delta *= -1; if ((gint) (gtk_adjustment_get_value (adj) + (gdouble) delta) >= 0 && (gint) (gtk_adjustment_get_value (adj) + (gdouble) delta) <= gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj)) { gtk_adjustment_set_value(adj, gtk_adjustment_get_value (adj) + (gdouble) delta); nav->priv->scroll_pos++; } else { if (delta > 0) gtk_adjustment_set_value (adj, gtk_adjustment_get_upper (adj) - gtk_adjustment_get_page_size (adj)); else gtk_adjustment_set_value (adj, 0); nav->priv->scroll_pos = 0; return FALSE; } return TRUE; }