Files
squeekboard/eek/eek-section.c
2010-06-04 12:09:08 +09:00

301 lines
8.5 KiB
C

/*
* Copyright (C) 2010 Daiki Ueno <ueno@unixuser.org>
* Copyright (C) 2010 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* 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., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*/
/**
* SECTION:eek-section
* @short_description: Base interface of a keyboard section
* @see_also: #EekKeyboard, #EekKey
*
* The #EekSectionIface interface represents a keyboard section, which
* is parented to #EekKeyboardIface and can have one or more keys of
* the #EekKeyIface interface.
*
* #EekSectionIface follows the Builder pattern and is responsible for
* creation of keys.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif /* HAVE_CONFIG_H */
#include "eek-section.h"
static void
eek_section_base_init (gpointer g_iface)
{
static gboolean is_initialized = FALSE;
if (!is_initialized) {
GParamSpec *pspec;
/**
* EekSection:name:
*
* The name of #EekSection.
*/
pspec = g_param_spec_string ("name",
"Name",
"Name",
NULL,
G_PARAM_READWRITE);
g_object_interface_install_property (g_iface, pspec);
/**
* EekSection:columns:
*
* The number of columns in #EekSection.
*/
pspec = g_param_spec_int ("columns",
"Columns",
"The number of columns in the section",
0, G_MAXINT, 0,
G_PARAM_READWRITE);
g_object_interface_install_property (g_iface, pspec);
/**
* EekSection:rows:
*
* The number of rows in #EekSection.
*/
pspec = g_param_spec_int ("rows",
"Rows",
"The number of rows of the section",
0, G_MAXINT, 0,
G_PARAM_READWRITE);
g_object_interface_install_property (g_iface, pspec);
/**
* EekSection:angle:
*
* The rotation angle of #EekSection.
*/
pspec = g_param_spec_int ("angle",
"Angle",
"Rotation angle of the section",
-360, 360, 0,
G_PARAM_READWRITE);
g_object_interface_install_property (g_iface, pspec);
/**
* EekSection:bounds:
*
* The bounding box of #EekSection.
*/
pspec = g_param_spec_boxed ("bounds",
"Bounds",
"Bounding box of the section",
EEK_TYPE_BOUNDS,
G_PARAM_READWRITE);
g_object_interface_install_property (g_iface, pspec);
is_initialized = TRUE;
}
}
GType
eek_section_get_type (void)
{
static GType iface_type = 0;
if (iface_type == 0) {
static const GTypeInfo info = {
sizeof (EekSectionIface),
eek_section_base_init,
NULL
};
iface_type = g_type_register_static (G_TYPE_INTERFACE,
"EekSection",
&info,
0);
}
return iface_type;
}
/**
* eek_section_set_dimensions:
* @section: a #EekSection
* @columns: the number of columns in @section
* @rows: the number of rows in @section
*
* Set dimensions of @section from @columns and @rows.
*/
void
eek_section_set_dimensions (EekSection *section,
gint columns,
gint rows)
{
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
g_return_if_fail (iface->set_dimensions);
(*iface->set_dimensions) (section, columns, rows);
}
/**
* eek_section_get_dimensions:
* @section: a #EekSection
* @columns: a pointer where the number of columns in @section is stored
* @rows: a pointer where the number of rows in @section is stored
*
* Get the rotation angle of @section.
*/
void
eek_section_get_dimensions (EekSection *section,
gint *columns,
gint *rows)
{
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
g_return_if_fail (iface->get_dimensions);
return (*iface->get_dimensions) (section, columns, rows);
}
/**
* eek_section_set_angle:
* @section: a #EekSection
* @angle: rotation angle of @section
*
* Set the rotation angle of @section to @angle.
*/
void
eek_section_set_angle (EekSection *section,
gint angle)
{
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
g_return_if_fail (iface->set_angle);
(*iface->set_angle) (section, angle);
}
/**
* eek_section_get_angle:
* @section: a #EekSection
*
* Get the rotation angle of @section.
*/
gint
eek_section_get_angle (EekSection *section)
{
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
g_return_val_if_fail (iface->get_angle, 0);
return (*iface->get_angle) (section);
}
/**
* eek_section_set_bounds:
* @section: a #EekSection
* @bounds: bounding box of @section
*
* Set the bounding box of @section to @bounds.
*/
void
eek_section_set_bounds (EekSection *section,
EekBounds *bounds)
{
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
g_return_if_fail (iface->set_bounds);
(*iface->set_bounds) (section, bounds);
}
/**
* eek_section_get_bounds:
* @section: a #EekSection
* @bounds: the bounding box of @section
*
* Get the bounding box of @section.
*/
void
eek_section_get_bounds (EekSection *section,
EekBounds *bounds)
{
EekSectionIface *iface = EEK_SECTION_GET_IFACE(section);
g_return_if_fail (iface->get_bounds);
return (*iface->get_bounds) (section, bounds);
}
/**
* eek_section_create_key:
* @section: a #EekSection
* @name: name of the key
* @keysyms: symbol matrix of the key
* @num_groups: number of rows in the @keysyms
* @num_levels: number of columns in the @keysyms
* @column: column index in the @section
* @row: row index in the section
* @outline: outline shape of the key
* @bounds: bounding box of the key
*
* Create an #EekKey instance and attach it to @section.
*/
EekKey *
eek_section_create_key (EekSection *section,
const gchar *name,
guint *keysyms,
gint num_groups,
gint num_levels,
gint column,
gint row,
EekOutline *outline,
EekBounds *bounds)
{
EekSectionIface *iface;
g_return_if_fail (EEK_IS_SECTION(section));
iface = EEK_SECTION_GET_IFACE(section);
g_return_if_fail (iface->create_key);
return (*iface->create_key) (section,
name,
keysyms,
num_groups,
num_levels,
column,
row,
outline,
bounds);
}
/**
* eek_section_foreach_key:
* @section: a #EekSection
* @func: a callback of #GFunc
* @user_data: a pointer to an object passed to @func
*
* Iterate over @section's children list.
*/
void
eek_section_foreach_key (EekSection *section,
GFunc func,
gpointer user_data)
{
EekSectionIface *iface;
g_return_if_fail (EEK_IS_SECTION(section));
iface = EEK_SECTION_GET_IFACE(section);
g_return_if_fail (iface->foreach_key);
return (*iface->foreach_key) (section, func, user_data);
}