gdk: Add GdkDevicePad

This is an interface meant to be implemented by the "pad" devices.
This device-specific interface exposes the mapping of all pad features,
it allows retrieving:
- The number of buttons/rings/strips
- The number of groups
- The number of modes a group has
- Whether a given button/ring/strip belongs to a given group

https://bugzilla.gnome.org/show_bug.cgi?id=770026
This commit is contained in:
Carlos Garnacho 2016-08-04 19:12:57 +02:00
parent f1a9cd466e
commit b8a77d4da3
8 changed files with 294 additions and 0 deletions

View File

@ -25,6 +25,7 @@
<xi:include href="xml/gdkseat.xml" />
<xi:include href="xml/gdkmonitor.xml" />
<xi:include href="xml/gdkdevice.xml" />
<xi:include href="xml/gdkdevicepad.xml" />
<xi:include href="xml/regions.xml" />
<xi:include href="xml/pixbufs.xml" />
<xi:include href="xml/rgba_colors.xml" />

View File

@ -796,6 +796,25 @@ gdk_device_type_get_type
GDK_MAX_TIMECOORD_AXES
</SECTION>
<SECTION>
<TITLE>GdkDevicePad</TITLE>
<FILE>gdkdevicepad</FILE>
GdkDevicePad
GdkDevicePadFeature
gdk_device_pad_get_n_groups
gdk_device_pad_get_group_n_modes
gdk_device_pad_get_n_features
gdk_device_pad_get_feature_group
<SUBSECTION Standard>
GDK_TYPE_DEVICE_PAD
GDK_DEVICE_PAD
GDK_IS_DEVICE_PAD
<SUBSECTION Private>
gdk_device_pad_get_type
</SECTION>
<SECTION>
<TITLE>GdkSeat</TITLE>
<FILE>gdkseat</FILE>

View File

@ -4,6 +4,7 @@ gdk_app_launch_context_get_type
gdk_cursor_get_type
gdk_device_get_type
gdk_device_manager_get_type
gdk_device_pad_get_type
gdk_display_get_type
gdk_display_manager_get_type
gdk_drag_context_get_type

View File

@ -71,6 +71,7 @@ gdk_public_h_sources = \
gdkcairo.h \
gdkcursor.h \
gdkdevice.h \
gdkdevicepad.h \
gdkdevicetool.h \
gdkdevicemanager.h \
gdkdisplay.h \
@ -114,6 +115,7 @@ gdk_private_headers = \
gdkcursorprivate.h \
gdkdevicemanagerprivate.h \
gdkdeviceprivate.h \
gdkdevicepadprivate.h \
gdkdevicetoolprivate.h \
gdkdisplaymanagerprivate.h \
gdkdisplayprivate.h \
@ -144,6 +146,7 @@ gdk_c_sources = \
gdkcursor.c \
gdkdeprecated.c \
gdkdevice.c \
gdkdevicepad.c \
gdkdevicetool.c \
gdkdevicemanager.c \
gdkdisplay.c \

View File

@ -33,6 +33,7 @@
#include <gdk/gdkcairo.h>
#include <gdk/gdkcursor.h>
#include <gdk/gdkdevice.h>
#include <gdk/gdkdevicepad.h>
#include <gdk/gdkdevicetool.h>
#include <gdk/gdkdevicemanager.h>
#include <gdk/gdkdisplay.h>

150
gdk/gdkdevicepad.c Normal file
View File

@ -0,0 +1,150 @@
/* GDK - The GIMP Drawing Kit
* Copyright (C) 2016 Red Hat
*
* 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, see <http://www.gnu.org/licenses/>.
*
* Author: Carlos Garnacho <carlosg@gnome.org>
*/
/**
* SECTION:gdkdevicepad
* @Short_description: Pad device interface
* @Title: GtkDevicePad
*
* #GdkDevicePad is an interface implemented by devices of type
* %GDK_SOURCE_TABLET_PAD, it allows querying the features provided
* by the pad device.
*
* Tablet pads may contain one or more groups, each containing a subset
* of the buttons/rings/strips available. gdk_device_pad_get_n_groups()
* can be used to obtain the number of groups, gdk_device_pad_get_n_features()
* and gdk_device_pad_get_feature_group() can be combined to find out the
* number of buttons/rings/strips the device has, and how are they grouped.
*
* Each of those groups have different modes, which may be used to map
* each individual pad feature to multiple actions. Only one mode is
* effective (current) for each given group, different groups may have
* different current modes. The number of available modes in a group can
* be found out through gdk_device_pad_get_group_n_modes(), and the current
* mode for a given group will be notified through the #GdkEventPadGroupMode
* event.
*
*/
#include "config.h"
#include "gdkdevicepad.h"
#include "gdkdevicepadprivate.h"
#include "gdkdeviceprivate.h"
G_DEFINE_INTERFACE (GdkDevicePad, gdk_device_pad, GDK_TYPE_DEVICE)
static void
gdk_device_pad_default_init (GdkDevicePadInterface *pad)
{
}
/**
* gdk_device_pad_get_n_groups:
* @pad: a #GdkDevicePad
*
* Returns the number of groups this pad device has. Pads have
* at least one group. A pad group is a subcollection of
* buttons/strip/rings that is affected collectively by a same
* current mode.
*
* Returns: The number of button/ring/strip groups in the pad.
*
* Since: 3.22
**/
gint
gdk_device_pad_get_n_groups (GdkDevicePad *pad)
{
GdkDevicePadInterface *iface = GDK_DEVICE_PAD_GET_IFACE (pad);
g_return_val_if_fail (GDK_IS_DEVICE_PAD (pad), 0);
return iface->get_n_groups (pad);
}
/**
* gdk_device_pad_get_group_n_modes:
* @pad: a #GdkDevicePad
* @group_idx: group to get the number of available modes from
*
* Returns the number of modes that @group may have.
*
* Returns: The number of modes available in @group.
*
* Since: 3.22
**/
gint
gdk_device_pad_get_group_n_modes (GdkDevicePad *pad,
gint group_idx)
{
GdkDevicePadInterface *iface = GDK_DEVICE_PAD_GET_IFACE (pad);
g_return_val_if_fail (GDK_IS_DEVICE_PAD (pad), 0);
g_return_val_if_fail (group_idx >= 0, 0);
return iface->get_group_n_modes (pad, group_idx);
}
/**
* gdk_device_pad_get_n_features:
* @pad: a #GdkDevicePad
* @feature: a pad feature
*
* Returns the number of features a tablet pad has.
*
* Returns: The amount of elements of type @feature that this pad has.
*
* Since: 3.22
**/
gint
gdk_device_pad_get_n_features (GdkDevicePad *pad,
GdkDevicePadFeature feature)
{
GdkDevicePadInterface *iface = GDK_DEVICE_PAD_GET_IFACE (pad);
g_return_val_if_fail (GDK_IS_DEVICE_PAD (pad), 0);
return iface->get_n_features (pad, feature);
}
/**
* gdk_device_pad_get_feature_group:
* @pad: a #GdkDevicePad
* @feature: the feature type to get the group from
* @feature_idx: the index of the feature to get the group from
*
* Returns the group the given @feature and @idx belong to,
* or -1 if feature/index do not exist in @pad.
*
* Returns: The group number of the queried pad feature.
*
* Since: 3.22
**/
gint
gdk_device_pad_get_feature_group (GdkDevicePad *pad,
GdkDevicePadFeature feature,
gint idx)
{
GdkDevicePadInterface *iface = GDK_DEVICE_PAD_GET_IFACE (pad);
g_return_val_if_fail (GDK_IS_DEVICE_PAD (pad), -1);
g_return_val_if_fail (idx >= 0, -1);
return iface->get_feature_group (pad, feature, idx);
}

74
gdk/gdkdevicepad.h Normal file
View File

@ -0,0 +1,74 @@
/* GDK - The GIMP Drawing Kit
* Copyright (C) 2016 Red Hat
*
* 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, see <http://www.gnu.org/licenses/>.
*
* Author: Carlos Garnacho <carlosg@gnome.org>
*/
#ifndef __GDK_DEVICE_PAD_H__
#define __GDK_DEVICE_PAD_H__
#if !defined (__GDK_H_INSIDE__) && !defined (GDK_COMPILATION)
#error "Only <gdk/gdk.h> can be included directly."
#endif
#include <gdk/gdkversionmacros.h>
#include <gdk/gdktypes.h>
G_BEGIN_DECLS
#define GDK_TYPE_DEVICE_PAD (gdk_device_pad_get_type ())
#define GDK_DEVICE_PAD(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GDK_TYPE_DEVICE_PAD, GdkDevicePad))
#define GDK_IS_DEVICE_PAD(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GDK_TYPE_DEVICE_PAD))
typedef struct _GdkDevicePad GdkDevicePad;
typedef struct _GdkDevicePadInterface GdkDevicePadInterface;
/**
* GdkDevicePadFeature:
* @GDK_DEVICE_PAD_FEATURE_BUTTON: a button
* @GDK_DEVICE_PAD_FEATURE_RING: a ring-shaped interactive area
* @GDK_DEVICE_PAD_FEATURE_STRIP: a straight interactive area
*
* A pad feature.
*/
typedef enum {
GDK_DEVICE_PAD_FEATURE_BUTTON,
GDK_DEVICE_PAD_FEATURE_RING,
GDK_DEVICE_PAD_FEATURE_STRIP
} GdkDevicePadFeature;
GDK_AVAILABLE_IN_3_22
GType gdk_device_pad_get_type (void) G_GNUC_CONST;
GDK_AVAILABLE_IN_3_22
gint gdk_device_pad_get_n_groups (GdkDevicePad *pad);
GDK_AVAILABLE_IN_3_22
gint gdk_device_pad_get_group_n_modes (GdkDevicePad *pad,
gint group_idx);
GDK_AVAILABLE_IN_3_22
gint gdk_device_pad_get_n_features (GdkDevicePad *pad,
GdkDevicePadFeature feature);
GDK_AVAILABLE_IN_3_22
gint gdk_device_pad_get_feature_group (GdkDevicePad *pad,
GdkDevicePadFeature feature,
gint feature_idx);
G_END_DECLS
#endif /* __GDK_DEVICE_PAD_H__ */

45
gdk/gdkdevicepadprivate.h Normal file
View File

@ -0,0 +1,45 @@
/* GDK - The GIMP Drawing Kit
* Copyright (C) 2016 Red Hat
*
* 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, see <http://www.gnu.org/licenses/>.
*
* Author: Carlos Garnacho <carlosg@gnome.org>
*/
#ifndef __GDK_DEVICE_PAD_PRIVATE_H__
#define __GDK_DEVICE_PAD_PRIVATE_H__
#include "gdkdevicepad.h"
G_BEGIN_DECLS
#define GDK_DEVICE_PAD_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GDK_TYPE_DEVICE_PAD, GdkDevicePadInterface))
struct _GdkDevicePadInterface {
GTypeInterface parent_interface;
gint (* get_n_groups) (GdkDevicePad *pad);
gint (* get_group_n_modes) (GdkDevicePad *pad,
gint group);
gint (* get_n_features) (GdkDevicePad *pad,
GdkDevicePadFeature feature);
gint (* get_feature_group) (GdkDevicePad *pad,
GdkDevicePadFeature feature,
gint idx);
};
G_END_DECLS
#endif /* __GDK_DEVICE_PAD_PRIVATE_H__ */