|
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, ¤t_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, ¤t_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, ¤t_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, ¤t_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 |
}
|