From 89da2f2c87245cfe8e5eb7373120228543bc300f Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Mon, 16 Sep 2024 23:27:59 +0200 Subject: [PATCH] Define YDK/YTKMM Touch Event API --- libs/tk/ydk/gdkenumtypes.c | 3 + libs/tk/ydk/gdkevents.c | 29 ++++ libs/tk/ydk/gdkwindow.c | 30 +++- libs/tk/ydk/ydk/gdk/gdkevents.h | 23 +++ libs/tk/ydkmm/ydkmm/gdkmm/event.h | 3 + libs/tk/ydkmm/ydkmm/gdkmm/window.h | 3 + libs/tk/ytk/gtkmain.c | 3 + libs/tk/ytk/gtkwidget.c | 48 ++++++ libs/tk/ytk/ytk/gtk/gtkwidget.h | 6 + libs/tk/ytkmm/widget.cc | 153 +++++++++++++++++++ libs/tk/ytkmm/ytkmm/gtkmm/private/widget_p.h | 3 + libs/tk/ytkmm/ytkmm/gtkmm/widget.h | 3 + 12 files changed, 306 insertions(+), 1 deletion(-) diff --git a/libs/tk/ydk/gdkenumtypes.c b/libs/tk/ydk/gdkenumtypes.c index 3309edcde8..8156e97300 100644 --- a/libs/tk/ydk/gdkenumtypes.c +++ b/libs/tk/ydk/gdkenumtypes.c @@ -229,6 +229,9 @@ gdk_event_mask_get_type (void) { GDK_PROXIMITY_OUT_MASK, "GDK_PROXIMITY_OUT_MASK", "proximity-out-mask" }, { GDK_SUBSTRUCTURE_MASK, "GDK_SUBSTRUCTURE_MASK", "substructure-mask" }, { GDK_SCROLL_MASK, "GDK_SCROLL_MASK", "scroll-mask" }, + { GDK_TOUCH_BEGIN_MASK, "GDK_TOUCH_BEGIN_MASK", "touch-begin-mask" }, + { GDK_TOUCH_UPDATE_MASK, "GDK_TOUCH_UPDATE_MASK", "touch-update-mask" }, + { GDK_TOUCH_END_MASK, "GDK_TOUCH_END_MASK", "touch-end-mask" }, { GDK_ALL_EVENTS_MASK, "GDK_ALL_EVENTS_MASK", "all-events-mask" }, { 0, NULL, NULL } }; diff --git a/libs/tk/ydk/gdkevents.c b/libs/tk/ydk/gdkevents.c index 0f8bba2f0a..95a42c0ac0 100644 --- a/libs/tk/ydk/gdkevents.c +++ b/libs/tk/ydk/gdkevents.c @@ -387,6 +387,14 @@ gdk_event_new (GdkEventType type) new_event->button.x_root = 0.; new_event->button.y_root = 0.; break; + case GDK_TOUCH_BEGIN: + case GDK_TOUCH_UPDATE: + case GDK_TOUCH_END: + new_event->touch.x = 0.; + new_event->touch.y = 0.; + new_event->touch.x_root = 0.; + new_event->touch.y_root = 0.; + break; case GDK_SCROLL: new_event->scroll.x = 0.; new_event->scroll.y = 0.; @@ -596,6 +604,10 @@ gdk_event_get_time (const GdkEvent *event) case GDK_3BUTTON_PRESS: case GDK_BUTTON_RELEASE: return event->button.time; + case GDK_TOUCH_BEGIN: + case GDK_TOUCH_UPDATE: + case GDK_TOUCH_END: + return event->touch.time; case GDK_SCROLL: return event->scroll.time; case GDK_KEY_PRESS: @@ -674,6 +686,11 @@ gdk_event_get_state (const GdkEvent *event, case GDK_BUTTON_RELEASE: *state = event->button.state; return TRUE; + case GDK_TOUCH_BEGIN: + case GDK_TOUCH_UPDATE: + case GDK_TOUCH_END: + *state = event->touch.state; + return TRUE; case GDK_SCROLL: *state = event->scroll.state; return TRUE; @@ -770,6 +787,12 @@ gdk_event_get_coords (const GdkEvent *event, x = event->motion.x; y = event->motion.y; break; + case GDK_TOUCH_BEGIN: + case GDK_TOUCH_UPDATE: + case GDK_TOUCH_END: + x = event->touch.x; + y = event->touch.y; + break; default: fetched = FALSE; break; @@ -820,6 +843,12 @@ gdk_event_get_root_coords (const GdkEvent *event, x = event->button.x_root; y = event->button.y_root; break; + case GDK_TOUCH_BEGIN: + case GDK_TOUCH_UPDATE: + case GDK_TOUCH_END: + x = event->touch.x_root; + y = event->touch.y_root; + break; case GDK_ENTER_NOTIFY: case GDK_LEAVE_NOTIFY: x = event->crossing.x_root; diff --git a/libs/tk/ydk/gdkwindow.c b/libs/tk/ydk/gdkwindow.c index 774b5b2cb0..fab05d1cac 100644 --- a/libs/tk/ydk/gdkwindow.c +++ b/libs/tk/ydk/gdkwindow.c @@ -9887,6 +9887,9 @@ static const guint type_masks[] = { 0, /* GDK_OWNER_CHANGE = 34 */ 0, /* GDK_GRAB_BROKEN = 35 */ 0, /* GDK_DAMAGE = 36 */ + GDK_TOUCH_BEGIN_MASK, /* GDK_TOUCH_BEGIN = 37 */ + GDK_TOUCH_UPDATE_MASK, /* GDK_TOUCH_UPDATE = 38 */ + GDK_TOUCH_END_MASK, /* GDK_TOUCH_END = 39 */ }; G_STATIC_ASSERT (G_N_ELEMENTS (type_masks) == GDK_EVENT_LAST); @@ -9929,6 +9932,14 @@ is_motion_type (GdkEventType type) type == GDK_LEAVE_NOTIFY; } +static gboolean +is_touch_type (GdkEventType type) +{ + return type == GDK_TOUCH_BEGIN || + type == GDK_TOUCH_UPDATE || + type == GDK_TOUCH_END; +} + static GdkWindowObject * find_common_ancestor (GdkWindowObject *win1, GdkWindowObject *win2) @@ -10873,6 +10884,19 @@ proxy_button_event (GdkEvent *source_event, event->scroll.delta_y = source_event->scroll.delta_y; return TRUE; + case GDK_TOUCH_BEGIN: + case GDK_TOUCH_UPDATE: + case GDK_TOUCH_END: + convert_toplevel_coords_to_window (event_win, + toplevel_x, toplevel_y, + &event->touch.x, &event->touch.y); + event->touch.sequence = source_event->touch.sequence; + event->touch.deviceid = source_event->touch.deviceid; + event->touch.x_root = source_event->touch.x_root; + event->touch.y_root = source_event->touch.y_root; + event->touch.state = state; + return TRUE; + default: return FALSE; } @@ -11057,7 +11081,8 @@ _gdk_windowing_got_event (GdkDisplay *display, return; if (!(is_button_type (event->type) || - is_motion_type (event->type)) || + is_motion_type (event->type) || + is_touch_type (event->type)) || event_private->window_type == GDK_WINDOW_ROOT) return; @@ -11147,6 +11172,9 @@ _gdk_windowing_got_event (GdkDisplay *display, else if (is_button_type (event->type)) unlink_event = proxy_button_event (event, serial); + else if (is_touch_type (event->type)) + unlink_event = proxy_button_event (event, + serial); if (event->type == GDK_BUTTON_RELEASE && !event->any.send_event) diff --git a/libs/tk/ydk/ydk/gdk/gdkevents.h b/libs/tk/ydk/ydk/gdk/gdkevents.h index f6b4e04d3a..5dc8e6657d 100644 --- a/libs/tk/ydk/ydk/gdk/gdkevents.h +++ b/libs/tk/ydk/ydk/gdk/gdkevents.h @@ -50,6 +50,7 @@ typedef struct _GdkEventNoExpose GdkEventNoExpose; typedef struct _GdkEventVisibility GdkEventVisibility; typedef struct _GdkEventMotion GdkEventMotion; typedef struct _GdkEventButton GdkEventButton; +typedef struct _GdkEventTouch GdkEventTouch; typedef struct _GdkEventScroll GdkEventScroll; typedef struct _GdkEventKey GdkEventKey; typedef struct _GdkEventFocus GdkEventFocus; @@ -152,6 +153,9 @@ typedef enum GDK_OWNER_CHANGE = 34, GDK_GRAB_BROKEN = 35, GDK_DAMAGE = 36, + GDK_TOUCH_BEGIN = 37, + GDK_TOUCH_UPDATE = 38, + GDK_TOUCH_END = 39, GDK_EVENT_LAST /* helper variable for decls */ } GdkEventType; @@ -181,6 +185,9 @@ typedef enum GDK_PROXIMITY_OUT_MASK = 1 << 19, GDK_SUBSTRUCTURE_MASK = 1 << 20, GDK_SCROLL_MASK = 1 << 21, + GDK_TOUCH_BEGIN_MASK = 1 << 22, + GDK_TOUCH_UPDATE_MASK = 1 << 23, + GDK_TOUCH_END_MASK = 1 << 24, GDK_ALL_EVENTS_MASK = 0x3FFFFE } GdkEventMask; @@ -325,6 +332,21 @@ struct _GdkEventButton gdouble x_root, y_root; }; +struct _GdkEventTouch +{ + GdkEventType type; + GdkWindow *window; + gint8 send_event; + guint32 time; + gdouble x; + gdouble y; + guint state; + guint sequence; + guint flags; + guint deviceid; + gdouble x_root, y_root; +}; + struct _GdkEventScroll { GdkEventType type; @@ -500,6 +522,7 @@ union _GdkEvent GdkEventVisibility visibility; GdkEventMotion motion; GdkEventButton button; + GdkEventTouch touch; GdkEventScroll scroll; GdkEventKey key; GdkEventCrossing crossing; diff --git a/libs/tk/ydkmm/ydkmm/gdkmm/event.h b/libs/tk/ydkmm/ydkmm/gdkmm/event.h index c4d091da36..7c3710d102 100644 --- a/libs/tk/ydkmm/ydkmm/gdkmm/event.h +++ b/libs/tk/ydkmm/ydkmm/gdkmm/event.h @@ -92,6 +92,9 @@ enum EventType OWNER_CHANGE, GRAB_BROKEN, DAMAGE, + TOUCH_BEGIN, + TOUCH_UPDATE, + TOUCH_END, EVENT_LAST }; diff --git a/libs/tk/ydkmm/ydkmm/gdkmm/window.h b/libs/tk/ydkmm/ydkmm/gdkmm/window.h index d951bb5bef..f9d2e8a6d7 100644 --- a/libs/tk/ydkmm/ydkmm/gdkmm/window.h +++ b/libs/tk/ydkmm/ydkmm/gdkmm/window.h @@ -91,6 +91,9 @@ enum EventMask PROXIMITY_OUT_MASK = 1 << 19, SUBSTRUCTURE_MASK = 1 << 20, SCROLL_MASK = 1 << 21, + TOUCH_BEGIN_MASK = 1 << 22, + TOUCH_UPDATE_MASK = 1 << 23, + TOUCH_END_MASK = 1 << 24, ALL_EVENTS_MASK = 0x3FFFFE }; diff --git a/libs/tk/ytk/gtkmain.c b/libs/tk/ytk/gtkmain.c index df84f4efeb..4cb2516a2f 100644 --- a/libs/tk/ytk/gtkmain.c +++ b/libs/tk/ytk/gtkmain.c @@ -1599,6 +1599,7 @@ gtk_main_do_event (GdkEvent *event) case GDK_BUTTON_PRESS: case GDK_2BUTTON_PRESS: case GDK_3BUTTON_PRESS: + case GDK_TOUCH_BEGIN: gtk_propagate_event (grab_widget, event); break; @@ -1636,6 +1637,8 @@ gtk_main_do_event (GdkEvent *event) /* else fall through */ case GDK_MOTION_NOTIFY: case GDK_BUTTON_RELEASE: + case GDK_TOUCH_UPDATE: + case GDK_TOUCH_END: case GDK_PROXIMITY_IN: case GDK_PROXIMITY_OUT: gtk_propagate_event (grab_widget, event); diff --git a/libs/tk/ytk/gtkwidget.c b/libs/tk/ytk/gtkwidget.c index b8f8d78636..8b58c36d2e 100644 --- a/libs/tk/ytk/gtkwidget.c +++ b/libs/tk/ytk/gtkwidget.c @@ -197,6 +197,9 @@ enum { KEYNAV_FAILED, DRAG_FAILED, DAMAGE_EVENT, + TOUCH_BEGIN, + TOUCH_UPDATE, + TOUCH_END, LAST_SIGNAL }; @@ -537,6 +540,9 @@ gtk_widget_class_init (GtkWidgetClass *klass) klass->drag_drop = NULL; klass->drag_data_received = NULL; klass->screen_changed = NULL; + klass->touch_begin_event = NULL; + klass->touch_update_event = NULL; + klass->touch_end_event = NULL; klass->can_activate_accel = gtk_widget_real_can_activate_accel; klass->grab_broken_event = NULL; klass->query_tooltip = gtk_widget_real_query_tooltip; @@ -2377,6 +2383,39 @@ gtk_widget_class_init (GtkWidgetClass *klass) G_TYPE_NONE, 1, GDK_TYPE_SCREEN); + + /* YTK Touch */ + widget_signals[TOUCH_BEGIN] = + g_signal_new (I_("touch-start"), + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkWidgetClass, touch_begin_event), + _gtk_boolean_handled_accumulator, NULL, + _gtk_marshal_BOOLEAN__BOXED, + G_TYPE_BOOLEAN, 1, + GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); + + widget_signals[TOUCH_UPDATE] = + g_signal_new (I_("touch-update"), + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkWidgetClass, touch_update_event), + _gtk_boolean_handled_accumulator, NULL, + _gtk_marshal_BOOLEAN__BOXED, + G_TYPE_BOOLEAN, 1, + GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); + + widget_signals[TOUCH_END] = + g_signal_new (I_("touch-end"), + G_TYPE_FROM_CLASS (gobject_class), + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (GtkWidgetClass, touch_end_event), + _gtk_boolean_handled_accumulator, NULL, + _gtk_marshal_BOOLEAN__BOXED, + G_TYPE_BOOLEAN, 1, + GDK_TYPE_EVENT | G_SIGNAL_TYPE_STATIC_SCOPE); + + /** * GtkWidget::can-activate-accel: * @widget: the object which received the signal @@ -5001,6 +5040,15 @@ gtk_widget_event_internal (GtkWidget *widget, case GDK_DAMAGE: signal_num = DAMAGE_EVENT; break; + case GDK_TOUCH_BEGIN: + signal_num = TOUCH_BEGIN; + break; + case GDK_TOUCH_END: + signal_num = TOUCH_END; + break; + case GDK_TOUCH_UPDATE: + signal_num = TOUCH_UPDATE; + break; default: g_warning ("gtk_widget_event(): unhandled event type: %d", event->type); signal_num = -1; diff --git a/libs/tk/ytk/ytk/gtk/gtkwidget.h b/libs/tk/ytk/ytk/gtk/gtkwidget.h index d26cd4d077..fc9546b226 100644 --- a/libs/tk/ytk/ytk/gtk/gtkwidget.h +++ b/libs/tk/ytk/ytk/gtk/gtkwidget.h @@ -726,6 +726,12 @@ struct _GtkWidgetClass GdkEventAny *event); gboolean (* window_state_event) (GtkWidget *widget, GdkEventWindowState *event); + gboolean (* touch_begin_event) (GtkWidget *widget, + GdkEventTouch *event); + gboolean (* touch_update_event) (GtkWidget *widget, + GdkEventTouch *event); + gboolean (* touch_end_event) (GtkWidget *widget, + GdkEventTouch *event); /* selection */ void (* selection_get) (GtkWidget *widget, diff --git a/libs/tk/ytkmm/widget.cc b/libs/tk/ytkmm/widget.cc index 831041fc41..02850fded1 100644 --- a/libs/tk/ytkmm/widget.cc +++ b/libs/tk/ytkmm/widget.cc @@ -3395,6 +3395,9 @@ void Widget_Class::class_init_function(void* g_class, void* class_data) klass->drag_motion = &drag_motion_callback; klass->drag_drop = &drag_drop_callback; klass->drag_data_received = &drag_data_received_callback; + klass->touch_begin_event = &touch_begin_callback; + klass->touch_update_event = &touch_update_callback; + klass->touch_end_event = &touch_end_callback; #ifdef GTKMM_ATKMM_ENABLED #ifndef GTKMM_DISABLE_DEPRECATED @@ -4344,6 +4347,120 @@ gboolean Widget_Class::button_release_event_callback(GtkWidget* self, GdkEventBu typedef gboolean RType; return RType(); } +gboolean Widget_Class::touch_begin_callback(GtkWidget* self, GdkEventTouch* p0) +{ + Glib::ObjectBase *const obj_base = static_cast( + Glib::ObjectBase::_get_current_wrapper((GObject*)self)); + + // Non-gtkmmproc-generated custom classes implicitly call the default + // Glib::ObjectBase constructor, which sets is_derived_. But gtkmmproc- + // generated classes can use this optimisation, which avoids the unnecessary + // parameter conversions if there is no possibility of the virtual function + // being overridden: + if(obj_base && obj_base->is_derived_()) + { + CppObjectType *const obj = dynamic_cast(obj_base); + if(obj) // This can be NULL during destruction. + { + try // Trap C++ exceptions which would normally be lost because this is a C callback. + { + // Call the virtual member method, which derived classes might override. + return static_cast(obj->on_touch_begin_event(p0)); + } + catch(...) + { + Glib::exception_handlers_invoke(); + } + } + } + + BaseClassType *const base = static_cast( + g_type_class_peek_parent(G_OBJECT_GET_CLASS(self)) // Get the parent class of the object class (The original underlying C class). + ); + + // Call the original underlying C function: + if(base && base->touch_begin_event) + return (*base->touch_begin_event)(self, p0); + + typedef gboolean RType; + return RType(); +} +gboolean Widget_Class::touch_update_callback(GtkWidget* self, GdkEventTouch* p0) +{ + Glib::ObjectBase *const obj_base = static_cast( + Glib::ObjectBase::_get_current_wrapper((GObject*)self)); + + // Non-gtkmmproc-generated custom classes implicitly call the default + // Glib::ObjectBase constructor, which sets is_derived_. But gtkmmproc- + // generated classes can use this optimisation, which avoids the unnecessary + // parameter conversions if there is no possibility of the virtual function + // being overridden: + if(obj_base && obj_base->is_derived_()) + { + CppObjectType *const obj = dynamic_cast(obj_base); + if(obj) // This can be NULL during destruction. + { + try // Trap C++ exceptions which would normally be lost because this is a C callback. + { + // Call the virtual member method, which derived classes might override. + return static_cast(obj->on_touch_update_event(p0)); + } + catch(...) + { + Glib::exception_handlers_invoke(); + } + } + } + + BaseClassType *const base = static_cast( + g_type_class_peek_parent(G_OBJECT_GET_CLASS(self)) // Get the parent class of the object class (The original underlying C class). + ); + + // Call the original underlying C function: + if(base && base->touch_update_event) + return (*base->touch_update_event)(self, p0); + + typedef gboolean RType; + return RType(); +} +gboolean Widget_Class::touch_end_callback(GtkWidget* self, GdkEventTouch* p0) +{ + Glib::ObjectBase *const obj_base = static_cast( + Glib::ObjectBase::_get_current_wrapper((GObject*)self)); + + // Non-gtkmmproc-generated custom classes implicitly call the default + // Glib::ObjectBase constructor, which sets is_derived_. But gtkmmproc- + // generated classes can use this optimisation, which avoids the unnecessary + // parameter conversions if there is no possibility of the virtual function + // being overridden: + if(obj_base && obj_base->is_derived_()) + { + CppObjectType *const obj = dynamic_cast(obj_base); + if(obj) // This can be NULL during destruction. + { + try // Trap C++ exceptions which would normally be lost because this is a C callback. + { + // Call the virtual member method, which derived classes might override. + return static_cast(obj->on_touch_end_event(p0)); + } + catch(...) + { + Glib::exception_handlers_invoke(); + } + } + } + + BaseClassType *const base = static_cast( + g_type_class_peek_parent(G_OBJECT_GET_CLASS(self)) // Get the parent class of the object class (The original underlying C class). + ); + + // Call the original underlying C function: + if(base && base->touch_end_event) + return (*base->touch_end_event)(self, p0); + + typedef gboolean RType; + return RType(); +} gboolean Widget_Class::scroll_event_callback(GtkWidget* self, GdkEventScroll* p0) { Glib::ObjectBase *const obj_base = static_cast( @@ -7516,6 +7633,42 @@ bool Gtk::Widget::on_button_release_event(GdkEventButton* event) typedef bool RType; return RType(); } +bool Gtk::Widget::on_touch_begin_event(GdkEventTouch* event) +{ + BaseClassType *const base = static_cast( + g_type_class_peek_parent(G_OBJECT_GET_CLASS(gobject_)) // Get the parent class of the object class (The original underlying C class). + ); + + if(base && base->touch_begin_event) + return (*base->touch_begin_event)(gobj(),event); + + typedef bool RType; + return RType(); +} +bool Gtk::Widget::on_touch_update_event(GdkEventTouch* event) +{ + BaseClassType *const base = static_cast( + g_type_class_peek_parent(G_OBJECT_GET_CLASS(gobject_)) // Get the parent class of the object class (The original underlying C class). + ); + + if(base && base->touch_update_event) + return (*base->touch_update_event)(gobj(),event); + + typedef bool RType; + return RType(); +} +bool Gtk::Widget::on_touch_end_event(GdkEventTouch* event) +{ + BaseClassType *const base = static_cast( + g_type_class_peek_parent(G_OBJECT_GET_CLASS(gobject_)) // Get the parent class of the object class (The original underlying C class). + ); + + if(base && base->touch_end_event) + return (*base->touch_end_event)(gobj(),event); + + typedef bool RType; + return RType(); +} bool Gtk::Widget::on_scroll_event(GdkEventScroll* event) { BaseClassType *const base = static_cast( diff --git a/libs/tk/ytkmm/ytkmm/gtkmm/private/widget_p.h b/libs/tk/ytkmm/ytkmm/gtkmm/private/widget_p.h index eaba9a3f12..10a2e5dbb7 100644 --- a/libs/tk/ytkmm/ytkmm/gtkmm/private/widget_p.h +++ b/libs/tk/ytkmm/ytkmm/gtkmm/private/widget_p.h @@ -90,6 +90,9 @@ protected: static gboolean drag_motion_callback(GtkWidget* self, GdkDragContext* p0, gint p1, gint p2, guint p3); static gboolean drag_drop_callback(GtkWidget* self, GdkDragContext* p0, gint p1, gint p2, guint p3); static void drag_data_received_callback(GtkWidget* self, GdkDragContext* p0, gint p1, gint p2, GtkSelectionData* p3, guint p4, guint p5); + static gboolean touch_begin_callback(GtkWidget*, GdkEventTouch*); + static gboolean touch_update_callback(GtkWidget*, GdkEventTouch*); + static gboolean touch_end_callback(GtkWidget*, GdkEventTouch*); #ifdef GTKMM_ATKMM_ENABLED #ifndef GTKMM_DISABLE_DEPRECATED diff --git a/libs/tk/ytkmm/ytkmm/gtkmm/widget.h b/libs/tk/ytkmm/ytkmm/gtkmm/widget.h index 058d030cc9..d07dc13974 100644 --- a/libs/tk/ytkmm/ytkmm/gtkmm/widget.h +++ b/libs/tk/ytkmm/ytkmm/gtkmm/widget.h @@ -490,6 +490,9 @@ protected: virtual bool on_drag_drop(const Glib::RefPtr& context, int x, int y, guint time); /// This is a default handler for the signal signal_drag_data_received(). virtual void on_drag_data_received(const Glib::RefPtr& context, int x, int y, const SelectionData& selection_data, guint info, guint time); + virtual bool on_touch_begin_event(GdkEventTouch* event); + virtual bool on_touch_update_event(GdkEventTouch* event); + virtual bool on_touch_end_event(GdkEventTouch* event); #ifdef GTKMM_ATKMM_ENABLED /// This is a default handler for the signal signal_get_accessible(). virtual Glib::RefPtr on_get_accessible();