diff --git a/src/include/v3270/actions.h b/src/include/v3270/actions.h index 02e8a34..03470b1 100644 --- a/src/include/v3270/actions.h +++ b/src/include/v3270/actions.h @@ -120,11 +120,6 @@ const LIB3270_PROPERTY * info; ///> @brief Action info. const void * listener; ///> @brief Signal listener for the action group. - struct { - const GVariantType * state; ///> @brief State type type. - const GVariantType * parameter; ///> @brief Parameter type. - } types; - /// @brief Activation method. void (*activate)(GAction *action, GVariant *parameter, GtkWidget *terminal); @@ -139,11 +134,14 @@ GParamSpec * enabled; } properties; + struct { + const GVariantType * type; ///> @brief State type. + } state; + void (*change_widget)(GAction *action, GtkWidget *from, GtkWidget *to); - gboolean (*get_enabled)(GAction *action, GtkWidget *terminal); - GVariant * (*get_state)(GAction *action, GtkWidget *terminal); - GVariant * (*get_state_hint)(GAction *action, GtkWidget *terminal); + gboolean (*get_enabled)(GAction *action, GtkWidget *terminal); + GVariant * (*get_state)(GAction *action, GtkWidget *terminal); } V3270ActionClass; diff --git a/src/terminal/actions/action.c b/src/terminal/actions/action.c index ccc872a..9b28b83 100644 --- a/src/terminal/actions/action.c +++ b/src/terminal/actions/action.c @@ -43,27 +43,22 @@ static void get_property(GObject *object, guint prop_id, GValue *value, GParamSpec *pspec); static void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec); - static gboolean get_enabled(GAction *action); - static void activate(GAction *action, GVariant *parameter); - static void change_widget(GAction *action, GtkWidget *from, GtkWidget *to); - static void finalize(GObject *object); - static const GVariantType * get_state_type(GAction *action); - static GVariant * get_state_property(GAction *action); - - static gboolean internal_get_enabled(GAction *action, GtkWidget *terminal); - static void internal_activate(GAction *action, GVariant *parameter, GtkWidget *terminal); - - static GVariant * internal_get_state(GAction *action, GtkWidget *terminal); - static GVariant * internal_get_state_hint(GAction *action, GtkWidget *terminal); + static gboolean get_enabled(GAction *action, GtkWidget *terminal); + static void activate(GAction *action, GVariant *parameter, GtkWidget *terminal); + static GVariant * get_state(GAction *action, GtkWidget *terminal); - static const GVariantType * get_parameter_type(GAction *action); - static GVariant * get_state_hint(GAction *action); - static const gchar * get_name(GAction *action); - - static void change_state(GAction *action, GVariant *value); + static const gchar * iface_get_name(GAction *action); + static const GVariantType * iface_get_parameter_type(GAction *action); + static GVariant * iface_get_state_hint(GAction *action); + static const GVariantType * iface_get_state_type(GAction *action); + static GVariant * iface_get_state(GAction *action); + static gboolean iface_get_enabled(GAction *action); + static GVariant * iface_get_state(GAction *object); + static void iface_change_state(GAction *object, GVariant *value); + static void iface_activate(GAction *object, GVariant *parameter); enum { PROP_NONE, @@ -79,17 +74,6 @@ G_DEFINE_TYPE_WITH_CODE(V3270Action, V3270Action, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(G_TYPE_ACTION, V3270_action_iface_init)) - void V3270_action_iface_init(GActionInterface *iface) { - iface->get_name = get_name; - iface->get_parameter_type = get_parameter_type; - iface->get_state_type = get_state_type; - iface->get_state_hint = get_state_hint; - iface->get_enabled = get_enabled; - iface->get_state = get_state_property; - iface->change_state = change_state; - iface->activate = activate; - } - void V3270Action_class_init(V3270ActionClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS(klass); @@ -97,10 +81,10 @@ debug("%s",__FUNCTION__); klass->change_widget = change_widget; - klass->get_enabled = internal_get_enabled; - klass->get_state = internal_get_state; - klass->get_state_hint = internal_get_state_hint; + klass->get_enabled = get_enabled; + klass->get_state = get_state; + klass->state.type = NULL; object_class->finalize = finalize; object_class->get_property = get_property; @@ -188,11 +172,7 @@ action->terminal = NULL; action->info = &default_info; - action->types.parameter = NULL; - - action->activate = internal_activate; -// action->get_state_property = internal_get_state_property; -// action->get_state_hint = internal_get_state_hint; + action->activate = activate; } @@ -217,7 +197,7 @@ switch (prop_id) { case PROP_NAME: - g_value_set_string(value, get_name(action)); + g_value_set_string(value, g_action_get_name(action)); break; case PROP_ICON_NAME: @@ -233,19 +213,19 @@ break; case PROP_PARAMETER_TYPE: - g_value_set_boxed(value, get_parameter_type(action)); + g_value_set_boxed(value, g_action_get_parameter_type(action)); break; case PROP_ENABLED: - g_value_set_boolean(value, get_enabled(action)); + g_value_set_boolean(value, g_action_get_enabled(action)); break; case PROP_STATE_TYPE: - g_value_set_boxed(value, get_state_type(action)); + g_value_set_boxed(value, g_action_get_state_type(action)); break; case PROP_STATE: - g_value_take_variant(value, get_state_property(action)); + g_value_take_variant(value, g_action_get_state(action)); break; default: @@ -254,46 +234,8 @@ } - void set_property(GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { - g_message("Action property \"%s\" is read-only",pspec->name); - } - - const gchar * get_name(GAction *action) { - return V3270_ACTION_GET_DESCRIPTOR(action)->name; - } - - GVariant * internal_get_state_hint(GAction G_GNUC_UNUSED(*action), GtkWidget G_GNUC_UNUSED(*terminal)) { - return NULL; - } - - GVariant * internal_get_state(GAction *object, GtkWidget G_GNUC_UNUSED(*terminal)) { - - V3270Action * action = V3270_ACTION(object); - - if(action->types.state == G_VARIANT_TYPE_BOOLEAN) - return g_variant_new_boolean(FALSE); - - return NULL; - } - - GVariant * get_state_property(GAction *object) { - return V3270_ACTION_GET_CLASS(object)->get_state(object,V3270_ACTION(object)->terminal); - } - - const GVariantType * get_parameter_type(GAction *action) { - return V3270_ACTION(action)->types.parameter; - } - - const GVariantType * get_state_type(GAction *object) { - return V3270_ACTION(object)->types.state; - } - - GVariant * get_state_hint(GAction *object) { - return V3270_ACTION_GET_CLASS(object)->get_state_hint(object,V3270_ACTION(object)->terminal); - } - - void change_state(GAction G_GNUC_UNUSED(*object), GVariant G_GNUC_UNUSED(*value)) { - debug("%s",__FUNCTION__); + void set_property(GObject *object, guint G_GNUC_UNUSED(prop_id), const GValue G_GNUC_UNUSED(*value), GParamSpec *pspec) { + g_message("Action %s property %s is read-only",g_action_get_name(G_ACTION(object)),pspec->name); } static gboolean bg_notify_enabled(GObject *action) { @@ -338,7 +280,7 @@ g_idle_add((GSourceFunc) bg_notify_enabled, G_OBJECT(action)); - if(action->types.state) + if(V3270_ACTION_GET_CLASS(action)->state.type) g_idle_add((GSourceFunc) bg_notify_state, G_OBJECT(action)); } @@ -367,43 +309,11 @@ return V3270_ACTION(object)->terminal; } - gboolean get_enabled(GAction *object) { - - V3270Action * action = V3270_ACTION(object); - - if(action && action->terminal) { - - if(action->info->group != LIB3270_ACTION_GROUP_NONE) { - - if(!lib3270_action_group_get_activatable(v3270_get_session(action->terminal),action->info->group)) - return FALSE; - - } - - return V3270_ACTION_GET_CLASS(object)->get_enabled(object,action->terminal); - } - - return FALSE; - - } - - void activate(GAction *object, GVariant *parameter) { - - V3270Action * action = V3270_ACTION(object); - - debug("%s: terminal=%p",__FUNCTION__,action->terminal); - - if(action && action->terminal) { - action->activate(object,parameter,action->terminal); - } - - } - - gboolean internal_get_enabled(GAction G_GNUC_UNUSED(*object), GtkWidget *terminal) { + gboolean get_enabled(GAction G_GNUC_UNUSED(*object), GtkWidget *terminal) { return terminal != NULL; } - void internal_activate(GAction *action, GVariant G_GNUC_UNUSED(*parameter), GtkWidget G_GNUC_UNUSED(*terminal)) { + void activate(GAction *action, GVariant G_GNUC_UNUSED(*parameter), GtkWidget G_GNUC_UNUSED(*terminal)) { g_message("Action %s can't be activated",g_action_get_name(action)); } @@ -421,14 +331,23 @@ } const gchar * v3270_action_get_tooltip(GAction *action) { - const gchar * tooltip = V3270_ACTION_GET_DESCRIPTOR(action)->description; + const gchar * tooltip; + + tooltip = V3270_ACTION_GET_DESCRIPTOR(action)->description; + if(tooltip) + return gettext(tooltip); + + tooltip = V3270_ACTION_GET_DESCRIPTOR(action)->summary; if(tooltip) return gettext(tooltip); return NULL; } + // + // Action methods. + // H3270 * v3270_action_get_session(GAction *action) { g_return_val_if_fail(V3270_IS_ACTION(action),NULL); return v3270_get_session(V3270_ACTION(action)->terminal); @@ -438,17 +357,6 @@ return G_ACTION(g_object_new(V3270_TYPE_ACTION, NULL)); } - /* - static GdkPixbuf * pixbuf_from_icon_name(GValue *value, GtkIconSize icon_size) { - - const gchar * icon_name = g_value_get_string(value); - - if(!icon_name) - return NULL; - - } - */ - GdkPixbuf * v3270_action_get_pixbuf(GAction *action, GtkIconSize icon_size, GtkIconLookupFlags flags) { const gchar * icon_name = v3270_action_get_icon_name(action); @@ -466,3 +374,84 @@ } +// +// Default methods. +// + GVariant * get_state(GAction G_GNUC_UNUSED(*object), GtkWidget *terminal) { + return g_variant_new_boolean(terminal != NULL); + } + +// +// Interface Methods. +// + void V3270_action_iface_init(GActionInterface *iface) { + iface->get_name = iface_get_name; + iface->get_parameter_type = iface_get_parameter_type; + iface->get_state_type = iface_get_state_type; + iface->get_state_hint = iface_get_state_hint; + iface->get_enabled = iface_get_enabled; + iface->get_state = iface_get_state; + iface->change_state = iface_change_state; + iface->activate = iface_activate; + } + + const gchar * iface_get_name(GAction *action) { + return V3270_ACTION_GET_DESCRIPTOR(action)->name; + } + + GVariant * iface_get_state(GAction *object) { + + GtkWidget * terminal = V3270_ACTION(object)->terminal; + + if(!terminal) + g_variant_new_boolean(FALSE); + + return V3270_ACTION_GET_CLASS(object)->get_state(object,terminal); + } + + const GVariantType * iface_get_parameter_type(GAction G_GNUC_UNUSED(*action)) { + return NULL; + } + + const GVariantType * iface_get_state_type(GAction *object) { + return V3270_ACTION_GET_CLASS(object)->state.type; + } + + GVariant * iface_get_state_hint(GAction G_GNUC_UNUSED(*object)) { + return NULL; + } + + void iface_change_state(GAction G_GNUC_UNUSED(*object), GVariant G_GNUC_UNUSED(*value)) { + debug("%s",__FUNCTION__); + } + + gboolean iface_get_enabled(GAction *object) { + + V3270Action * action = V3270_ACTION(object); + + if(action && action->terminal) { + + if(action->info->group != LIB3270_ACTION_GROUP_NONE) { + + if(!lib3270_action_group_get_activatable(v3270_get_session(action->terminal),action->info->group)) + return FALSE; + + } + + return V3270_ACTION_GET_CLASS(object)->get_enabled(object,action->terminal); + } + + return FALSE; + + } + + void iface_activate(GAction *object, GVariant *parameter) { + + V3270Action * action = V3270_ACTION(object); + + if(action && action->terminal) { + action->activate(object,parameter,action->terminal); + } + + } + diff --git a/v3270.cbp b/v3270.cbp index 6cfa6a9..e51a98c 100644 --- a/v3270.cbp +++ b/v3270.cbp @@ -171,7 +171,6 @@