예제 #1
0
파일: eog-thumb-nav.c 프로젝트: DOICHE/eog
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;
	}
}
예제 #2
0
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;
}
예제 #3
0
파일: eog-thumb-nav.c 프로젝트: DOICHE/eog
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;
}
예제 #4
0
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;
}
예제 #5
0
파일: eog-thumb-nav.c 프로젝트: DOICHE/eog
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));
}
예제 #6
0
파일: eog-thumb-nav.c 프로젝트: DOICHE/eog
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;
}
예제 #7
0
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;
  }
}
예제 #8
0
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);
}
예제 #9
0
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);
}
예제 #10
0
파일: eog-thumb-nav.c 프로젝트: DOICHE/eog
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;
}