diff --git a/docs/reference/gdk/gdk3-sections.txt b/docs/reference/gdk/gdk3-sections.txt index a2757c7ab2..786a5ad13d 100644 --- a/docs/reference/gdk/gdk3-sections.txt +++ b/docs/reference/gdk/gdk3-sections.txt @@ -716,6 +716,7 @@ GdkInputSource GdkInputMode GdkAxisUse GdkAxisFlags +GdkDeviceToolType GdkDeviceType GdkGrabOwnership @@ -761,6 +762,7 @@ gdk_device_get_last_event_window gdk_device_tool_get_serial +gdk_device_tool_get_tool_type GDK_TYPE_AXIS_USE diff --git a/gdk/gdkdevice.c b/gdk/gdkdevice.c index 63b3f5dc07..bd1240d521 100644 --- a/gdk/gdkdevice.c +++ b/gdk/gdkdevice.c @@ -2030,6 +2030,7 @@ G_DEFINE_TYPE (GdkDeviceTool, gdk_device_tool, G_TYPE_OBJECT) enum { TOOL_PROP_0, TOOL_PROP_SERIAL, + TOOL_PROP_TOOL_TYPE, N_TOOL_PROPS }; @@ -2048,6 +2049,9 @@ gdk_device_tool_set_property (GObject *object, case TOOL_PROP_SERIAL: tool->serial = g_value_get_uint64 (value); break; + case TOOL_PROP_TOOL_TYPE: + tool->type = g_value_get_enum (value); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -2067,6 +2071,9 @@ gdk_device_tool_get_property (GObject *object, case TOOL_PROP_SERIAL: g_value_set_uint64 (value, tool->serial); break; + case TOOL_PROP_TOOL_TYPE: + g_value_set_enum (value, tool->type); + break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -2087,6 +2094,13 @@ gdk_device_tool_class_init (GdkDeviceToolClass *klass) 0, G_MAXUINT64, 0, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); + tool_props[TOOL_PROP_TOOL_TYPE] = g_param_spec_enum ("tool-type", + "Tool type", + "Tool type", + GDK_TYPE_DEVICE_TOOL_TYPE, + GDK_DEVICE_TOOL_TYPE_UNKNOWN, + G_PARAM_READWRITE | + G_PARAM_CONSTRUCT_ONLY); g_object_class_install_properties (object_class, N_TOOL_PROPS, tool_props); } @@ -2097,10 +2111,12 @@ gdk_device_tool_init (GdkDeviceTool *tool) } GdkDeviceTool * -gdk_device_tool_new (guint64 serial) +gdk_device_tool_new (guint64 serial, + GdkDeviceToolType type) { return g_object_new (GDK_TYPE_DEVICE_TOOL, "serial", serial, + "tool-type", type, NULL); } @@ -2133,3 +2149,22 @@ gdk_device_tool_get_serial (GdkDeviceTool *tool) return tool->serial; } + +/** + * gdk_device_tool_get_tool_type: + * @tool: a #GdkDeviceTool + * + * Gets the #GdkDeviceToolType of the tool. + * + * Returns: The physical type for this tool. This can be used to figure out what + * sort of pen is being used, such as an airbrush or a pencil. + * + * Since: 3.22 + **/ +GdkDeviceToolType +gdk_device_tool_get_tool_type (GdkDeviceTool *tool) +{ + g_return_val_if_fail (tool != NULL, GDK_DEVICE_TOOL_TYPE_UNKNOWN); + + return tool->type; +} diff --git a/gdk/gdkdevice.h b/gdk/gdkdevice.h index 84ee37fde3..495c4dc20b 100644 --- a/gdk/gdkdevice.h +++ b/gdk/gdkdevice.h @@ -164,6 +164,33 @@ typedef enum { GDK_DEVICE_TYPE_FLOATING } GdkDeviceType; +/** + * GdkDeviceToolType: + * @GDK_DEVICE_TOOL_TYPE_UNKNOWN: Tool is of an unknown type. + * @GDK_DEVICE_TOOL_TYPE_PEN: Tool is a standard tablet stylus. + * @GDK_DEVICE_TOOL_TYPE_ERASER: Tool is standard tablet eraser. + * @GDK_DEVICE_TOOL_TYPE_BRUSH: Tool is a brush stylus. + * @GDK_DEVICE_TOOL_TYPE_PENCIL: Tool is a pencil stylus. + * @GDK_DEVICE_TOOL_TYPE_AIRBRUSH: Tool is an airbrush stylus. + * @GDK_DEVICE_TOOL_TYPE_MOUSE: Tool is a mouse. + * @GDK_DEVICE_TOOL_TYPE_LENS: Tool is a lens cursor. + * + * Indicates the specific type of tool being used being a tablet. Such as an + * airbrush, pencil, etc. + * + * Since: 3.22 + */ +typedef enum { + GDK_DEVICE_TOOL_TYPE_UNKNOWN, + GDK_DEVICE_TOOL_TYPE_PEN, + GDK_DEVICE_TOOL_TYPE_ERASER, + GDK_DEVICE_TOOL_TYPE_BRUSH, + GDK_DEVICE_TOOL_TYPE_PENCIL, + GDK_DEVICE_TOOL_TYPE_AIRBRUSH, + GDK_DEVICE_TOOL_TYPE_MOUSE, + GDK_DEVICE_TOOL_TYPE_LENS, +} GdkDeviceToolType; + /* We don't allocate each coordinate this big, but we use it to * be ANSI compliant and avoid accessing past the defined limits. */ @@ -331,6 +358,9 @@ GType gdk_device_tool_get_type (void) G_GNUC_CONST; GDK_AVAILABLE_IN_3_22 guint gdk_device_tool_get_serial (GdkDeviceTool *tool); +GDK_AVAILABLE_IN_3_22 +GdkDeviceToolType gdk_device_tool_get_tool_type (GdkDeviceTool *tool); + G_END_DECLS #endif /* __GDK_DEVICE_H__ */ diff --git a/gdk/gdkdeviceprivate.h b/gdk/gdkdeviceprivate.h index 52ee6c69ef..6a0221ff00 100644 --- a/gdk/gdkdeviceprivate.h +++ b/gdk/gdkdeviceprivate.h @@ -37,6 +37,7 @@ struct _GdkDeviceTool { GObject parent_instance; guint64 serial; + GdkDeviceToolType type; }; struct _GdkDeviceToolClass @@ -198,7 +199,8 @@ void gdk_device_set_seat (GdkDevice *device, GdkSeat *seat); /* Device tools */ -GdkDeviceTool *gdk_device_tool_new (guint64 serial); +GdkDeviceTool *gdk_device_tool_new (guint64 serial, + GdkDeviceToolType type); void gdk_device_update_tool (GdkDevice *device, GdkDeviceTool *tool); diff --git a/gdk/x11/gdkdevicemanager-xi2.c b/gdk/x11/gdkdevicemanager-xi2.c index b70f5a7517..71d014d353 100644 --- a/gdk/x11/gdkdevicemanager-xi2.c +++ b/gdk/x11/gdkdevicemanager-xi2.c @@ -1022,7 +1022,8 @@ handle_property_change (GdkX11DeviceManagerXI2 *device_manager, if (!tool && serial_id > 0) { - tool = gdk_device_tool_new (serial_id); + tool = gdk_device_tool_new (serial_id, + GDK_DEVICE_TOOL_TYPE_UNKNOWN); gdk_seat_default_add_tool (GDK_SEAT_DEFAULT (seat), tool); } }