Blame src/st/st-generic-accessible.c

Packit d345d1
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
Packit d345d1
/*
Packit d345d1
 * st-generic-accessible.c: generic accessible
Packit d345d1
 *
Packit d345d1
 * Copyright 2013 Igalia, S.L.
Packit d345d1
 *
Packit d345d1
 * This program is free software; you can redistribute it and/or modify it
Packit d345d1
 * under the terms and conditions of the GNU Lesser General Public License,
Packit d345d1
 * version 2.1, as published by the Free Software Foundation.
Packit d345d1
 *
Packit d345d1
 * This program is distributed in the hope it will be useful, but WITHOUT ANY
Packit d345d1
 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
Packit d345d1
 * FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
Packit d345d1
 * more details.
Packit d345d1
 *
Packit d345d1
 * You should have received a copy of the GNU Lesser General Public License
Packit d345d1
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
Packit d345d1
 */
Packit d345d1
Packit d345d1
/**
Packit d345d1
 * SECTION:st-generic-accessible
Packit d345d1
 * @short_description: An accessible class with signals for
Packit d345d1
 * implementing specific Atk interfaces
Packit d345d1
 *
Packit d345d1
 * #StGenericAccessible is mainly a workaround for the current lack of
Packit d345d1
 * of a proper support for GValue at javascript. See bug#703412 for
Packit d345d1
 * more information. We implement the accessible interfaces, but proxy
Packit d345d1
 * the virtual functions into signals, which gjs can catch.
Packit d345d1
 *
Packit d345d1
 * #StGenericAccessible is an #StWidgetAccessible
Packit d345d1
 */
Packit d345d1
Packit d345d1
#ifdef HAVE_CONFIG_H
Packit d345d1
#include "config.h"
Packit d345d1
#endif
Packit d345d1
Packit d345d1
#include "st-generic-accessible.h"
Packit d345d1
Packit d345d1
static void atk_value_iface_init (AtkValueIface *iface);
Packit d345d1
Packit d345d1
G_DEFINE_TYPE_WITH_CODE(StGenericAccessible,
Packit d345d1
                        st_generic_accessible,
Packit d345d1
                        ST_TYPE_WIDGET_ACCESSIBLE,
Packit d345d1
                        G_IMPLEMENT_INTERFACE (ATK_TYPE_VALUE,
Packit d345d1
                                               atk_value_iface_init));
Packit d345d1
/* Signals */
Packit d345d1
enum
Packit d345d1
{
Packit d345d1
  GET_CURRENT_VALUE,
Packit d345d1
  GET_MAXIMUM_VALUE,
Packit d345d1
  GET_MINIMUM_VALUE,
Packit d345d1
  SET_CURRENT_VALUE,
Packit d345d1
  GET_MINIMUM_INCREMENT,
Packit d345d1
  LAST_SIGNAL
Packit d345d1
};
Packit d345d1
Packit d345d1
static guint st_generic_accessible_signals [LAST_SIGNAL] = { 0 };
Packit d345d1
Packit d345d1
static void
Packit d345d1
st_generic_accessible_init (StGenericAccessible *accessible)
Packit d345d1
{
Packit d345d1
}
Packit d345d1
Packit d345d1
static void
Packit d345d1
st_generic_accessible_class_init (StGenericAccessibleClass *klass)
Packit d345d1
{
Packit d345d1
  /**
Packit d345d1
   * StGenericAccessible::get-current-value:
Packit d345d1
   * @self: the #StGenericAccessible
Packit d345d1
   *
Packit d345d1
   * Emitted when atk_value_get_current_value() is called on
Packit d345d1
   * @self. Right now we only care about doubles, so the value is
Packit d345d1
   * directly returned by the signal.
Packit d345d1
   *
Packit d345d1
   * Return value: value of the current element.
Packit d345d1
   */
Packit d345d1
  st_generic_accessible_signals[GET_CURRENT_VALUE] =
Packit d345d1
    g_signal_new ("get-current-value",
Packit d345d1
                  G_TYPE_FROM_CLASS (klass),
Packit d345d1
                  G_SIGNAL_RUN_LAST,
Packit d345d1
                  0,
Packit d345d1
                  NULL, NULL, NULL,
Packit d345d1
                  G_TYPE_DOUBLE, 0);
Packit d345d1
Packit d345d1
  /**
Packit d345d1
   * StGenericAccessible::get-maximum-value:
Packit d345d1
   * @self: the #StGenericAccessible
Packit d345d1
   *
Packit d345d1
   * Emitted when atk_value_get_maximum_value() is called on
Packit d345d1
   * @self. Right now we only care about doubles, so the value is
Packit d345d1
   * directly returned by the signal.
Packit d345d1
   *
Packit d345d1
   * Return value: maximum value of the accessible.
Packit d345d1
   */
Packit d345d1
  st_generic_accessible_signals[GET_MAXIMUM_VALUE] =
Packit d345d1
    g_signal_new ("get-maximum-value",
Packit d345d1
                  G_TYPE_FROM_CLASS (klass),
Packit d345d1
                  G_SIGNAL_RUN_LAST,
Packit d345d1
                  0,
Packit d345d1
                  NULL, NULL, NULL,
Packit d345d1
                  G_TYPE_DOUBLE, 0);
Packit d345d1
Packit d345d1
  /**
Packit d345d1
   * StGenericAccessible::get-minimum-value:
Packit d345d1
   * @self: the #StGenericAccessible
Packit d345d1
   *
Packit d345d1
   * Emitted when atk_value_get_current_value() is called on
Packit d345d1
   * @self. Right now we only care about doubles, so the value is
Packit d345d1
   * directly returned by the signal.
Packit d345d1
   *
Packit d345d1
   * Return value: minimum value of the accessible.
Packit d345d1
   */
Packit d345d1
  st_generic_accessible_signals[GET_MINIMUM_VALUE] =
Packit d345d1
    g_signal_new ("get-minimum-value",
Packit d345d1
                  G_TYPE_FROM_CLASS (klass),
Packit d345d1
                  G_SIGNAL_RUN_LAST,
Packit d345d1
                  0,
Packit d345d1
                  NULL, NULL, NULL,
Packit d345d1
                  G_TYPE_DOUBLE, 0);
Packit d345d1
Packit d345d1
  /**
Packit d345d1
   * StGenericAccessible::get-minimum-increment:
Packit d345d1
   * @self: the #StGenericAccessible
Packit d345d1
   *
Packit d345d1
   * Emitted when atk_value_get_minimum_increment() is called on
Packit d345d1
   * @self. Right now we only care about doubles, so the value is
Packit d345d1
   * directly returned by the signal.
Packit d345d1
   *
Packit d345d1
   * Return value: value of the current element.
Packit d345d1
   */
Packit d345d1
  st_generic_accessible_signals[GET_MINIMUM_INCREMENT] =
Packit d345d1
    g_signal_new ("get-minimum-increment",
Packit d345d1
                  G_TYPE_FROM_CLASS (klass),
Packit d345d1
                  G_SIGNAL_RUN_LAST,
Packit d345d1
                  0,
Packit d345d1
                  NULL, NULL, NULL,
Packit d345d1
                  G_TYPE_DOUBLE, 0);
Packit d345d1
Packit d345d1
  /**
Packit d345d1
   * StGenericAccessible::set-current-value:
Packit d345d1
   * @self: the #StGenericAccessible
Packit d345d1
   * @new_value: the new value for the accessible
Packit d345d1
   *
Packit d345d1
   * Emitted when atk_value_set_current_value() is called on
Packit d345d1
   * @self. Right now we only care about doubles, so the value is
Packit d345d1
   * directly returned by the signal.
Packit d345d1
   */
Packit d345d1
  st_generic_accessible_signals[SET_CURRENT_VALUE] =
Packit d345d1
    g_signal_new ("set-current-value",
Packit d345d1
                  G_TYPE_FROM_CLASS (klass),
Packit d345d1
                  G_SIGNAL_RUN_LAST,
Packit d345d1
                  0,
Packit d345d1
                  NULL, NULL, NULL,
Packit d345d1
                  G_TYPE_NONE, 1, G_TYPE_DOUBLE);
Packit d345d1
Packit d345d1
}
Packit d345d1
Packit d345d1
static void
Packit d345d1
st_generic_accessible_get_current_value (AtkValue *obj,
Packit d345d1
                                         GValue   *value)
Packit d345d1
{
Packit d345d1
  gdouble current_value = 0;
Packit d345d1
Packit d345d1
  g_value_init (value, G_TYPE_DOUBLE);
Packit d345d1
  g_signal_emit (G_OBJECT (obj), st_generic_accessible_signals[GET_CURRENT_VALUE], 0, &current_value);
Packit d345d1
  g_value_set_double (value, current_value);
Packit d345d1
}
Packit d345d1
Packit d345d1
static void
Packit d345d1
st_generic_accessible_get_maximum_value (AtkValue *obj,
Packit d345d1
                                         GValue   *value)
Packit d345d1
{
Packit d345d1
  gdouble current_value = 0;
Packit d345d1
Packit d345d1
  g_value_init (value, G_TYPE_DOUBLE);
Packit d345d1
  g_signal_emit (G_OBJECT (obj), st_generic_accessible_signals[GET_MAXIMUM_VALUE], 0, &current_value);
Packit d345d1
  g_value_set_double (value, current_value);
Packit d345d1
}
Packit d345d1
Packit d345d1
static void
Packit d345d1
st_generic_accessible_get_minimum_value (AtkValue *obj,
Packit d345d1
                                         GValue   *value)
Packit d345d1
{
Packit d345d1
  gdouble current_value = 0;
Packit d345d1
Packit d345d1
  g_value_init (value, G_TYPE_DOUBLE);
Packit d345d1
  g_signal_emit (G_OBJECT (obj), st_generic_accessible_signals[GET_MINIMUM_VALUE], 0, &current_value);
Packit d345d1
  g_value_set_double (value, current_value);
Packit d345d1
}
Packit d345d1
Packit d345d1
static void
Packit d345d1
st_generic_accessible_get_minimum_increment (AtkValue *obj,
Packit d345d1
                                             GValue   *value)
Packit d345d1
{
Packit d345d1
  gdouble current_value = 0;
Packit d345d1
Packit d345d1
  g_value_init (value, G_TYPE_DOUBLE);
Packit d345d1
  g_signal_emit (G_OBJECT (obj), st_generic_accessible_signals[GET_MINIMUM_INCREMENT], 0, &current_value);
Packit d345d1
  g_value_set_double (value, current_value);
Packit d345d1
}
Packit d345d1
Packit d345d1
static gboolean
Packit d345d1
st_generic_accessible_set_current_value (AtkValue *obj,
Packit d345d1
                                         const GValue *value)
Packit d345d1
{
Packit d345d1
  gdouble current_value = 0;
Packit d345d1
Packit d345d1
  current_value = g_value_get_double (value);
Packit d345d1
  g_signal_emit (G_OBJECT (obj), st_generic_accessible_signals[SET_CURRENT_VALUE], 0, current_value);
Packit d345d1
Packit d345d1
  return TRUE; // we assume that the value was properly set
Packit d345d1
}
Packit d345d1
Packit d345d1
static void
Packit d345d1
atk_value_iface_init (AtkValueIface *iface)
Packit d345d1
{
Packit d345d1
  iface->get_current_value = st_generic_accessible_get_current_value;
Packit d345d1
  iface->get_maximum_value = st_generic_accessible_get_maximum_value;
Packit d345d1
  iface->get_minimum_value = st_generic_accessible_get_minimum_value;
Packit d345d1
  iface->get_minimum_increment = st_generic_accessible_get_minimum_increment;
Packit d345d1
  iface->set_current_value = st_generic_accessible_set_current_value;
Packit d345d1
}
Packit d345d1
Packit d345d1
AtkObject*
Packit d345d1
st_generic_accessible_new_for_actor (ClutterActor *actor)
Packit d345d1
{
Packit d345d1
  AtkObject *accessible = NULL;
Packit d345d1
Packit d345d1
  g_return_val_if_fail (CLUTTER_IS_ACTOR (actor), NULL);
Packit d345d1
Packit d345d1
  accessible = ATK_OBJECT (g_object_new (ST_TYPE_GENERIC_ACCESSIBLE,
Packit d345d1
                                         NULL));
Packit d345d1
  atk_object_initialize (accessible, actor);
Packit d345d1
Packit d345d1
  return accessible;
Packit d345d1
}