diff --git a/src/objects/actions/abstract.c b/src/objects/actions/abstract.c index 46dd0e1..2b32870 100644 --- a/src/objects/actions/abstract.c +++ b/src/objects/actions/abstract.c @@ -63,6 +63,7 @@ PROP_STATE }; + /* enum { SIGNAL_CHANGE_STATE, NR_SIGNALS @@ -70,6 +71,9 @@ static guint action_signals[NR_SIGNALS]; + */ + + G_DEFINE_TYPE_WITH_CODE(pw3270Action, pw3270Action, G_TYPE_OBJECT, G_IMPLEMENT_INTERFACE(G_TYPE_ACTION, pw3270_action_iface_init)) void pw3270_action_iface_init(GActionInterface *iface) { @@ -123,8 +127,7 @@ N_("State Type"), N_("The type of the state kept by the action"), G_TYPE_VARIANT_TYPE, - G_PARAM_READABLE | - G_PARAM_STATIC_STRINGS)); + G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); // Enabled property klass->properties.enabled = @@ -146,12 +149,12 @@ N_("The state the action is in"), G_VARIANT_TYPE_ANY, NULL, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT | - G_PARAM_STATIC_STRINGS + G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS ); g_object_class_install_property (object_class, PROP_STATE, klass->properties.state); + /* // Install signals action_signals[SIGNAL_CHANGE_STATE] = g_signal_new( @@ -163,6 +166,7 @@ G_TYPE_NONE, 1, G_TYPE_VARIANT ); + */ } void pw3270Action_init(pw3270Action *action) { @@ -304,19 +308,37 @@ debug("%s",__FUNCTION__) } - void pw3270_action_notify_enabled(GAction *object) { - g_object_notify(G_OBJECT (object), "enabled"); + static gboolean bg_notify_enabled(GObject *action) { + g_object_notify(action, "enabled"); + return FALSE; } - void pw3270_action_notify_state(GAction *object) { - g_object_notify(G_OBJECT (object), "state"); + void pw3270_action_notify_enabled(GAction *action) { + g_idle_add((GSourceFunc) bg_notify_enabled, G_OBJECT(action)); + } + + static gboolean bg_notify_state(GObject *action) { + g_object_notify(action, "state"); + return FALSE; + } + + void pw3270_action_notify_state(GAction *action) { + g_idle_add((GSourceFunc) bg_notify_state, G_OBJECT(action)); } static void change_widget(GAction *action, GtkWidget *from, GtkWidget *to) { if(from != to) { - PW3270_ACTION(action)->terminal = to; + + pw3270Action *pAction = PW3270_ACTION(action); + + pAction->terminal = to; + pw3270_action_notify_enabled(action); + + if(pAction->types.state) + pw3270_action_notify_state(action); + } } diff --git a/src/objects/actions/lib3270/action.c b/src/objects/actions/lib3270/action.c index 8bd2e1c..1e35abc 100644 --- a/src/objects/actions/lib3270/action.c +++ b/src/objects/actions/lib3270/action.c @@ -133,14 +133,8 @@ return G_ACTION(action); } - static gboolean bg_notify_enabled(GAction *action) { -// debug("Action %s was notified (%s)",g_action_get_name(action),g_action_get_enabled(action) ? "Enabled" : "Disabled"); - pw3270_action_notify_enabled(action); - return FALSE; - } - static void event_listener(H3270 G_GNUC_UNUSED(*hSession), void *object) { - g_idle_add((GSourceFunc) bg_notify_enabled, G_ACTION(object)); + pw3270_action_notify_enabled(G_ACTION(object)); } void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) { @@ -160,10 +154,5 @@ action->listener = lib3270_register_action_group_listener(pw3270_action_get_session(object),action->definition->group,event_listener,object); } - // Does the "enabled" state has changed? If yes notify customers. - gboolean enabled = get_enabled(object,to); - if(get_enabled(object,from) != enabled) - pw3270_action_notify_enabled(object); - } diff --git a/src/objects/actions/lib3270/pakey.c b/src/objects/actions/lib3270/pakey.c index 76c17b0..334eb82 100644 --- a/src/objects/actions/lib3270/pakey.c +++ b/src/objects/actions/lib3270/pakey.c @@ -51,7 +51,6 @@ static void Lib3270PaAction_class_init(Lib3270PaActionClass *klass); static void Lib3270PaAction_init(Lib3270PaAction *action); - static void change_widget(GAction *object, GtkWidget *from, GtkWidget *to); G_DEFINE_TYPE(Lib3270PaAction, Lib3270PaAction, PW3270_TYPE_ACTION); @@ -97,7 +96,6 @@ void Lib3270PaAction_class_init(Lib3270PaActionClass *klass) { klass->parent_class.get_enabled = get_enabled; - klass->parent_class.change_widget = change_widget; } @@ -113,14 +111,3 @@ return G_ACTION(g_object_new(PW3270_TYPE_PAKEY_ACTION, NULL)); } - void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) { - - PW3270_ACTION_CLASS(Lib3270PaAction_parent_class)->change_widget(object,from,to); - - // Does the "enabled" state has changed? If yes notify customers. - gboolean enabled = get_enabled(object,to); - if(get_enabled(object,from) != enabled) - pw3270_action_notify_enabled(object); - - } - diff --git a/src/objects/actions/lib3270/pfkey.c b/src/objects/actions/lib3270/pfkey.c index 899d500..9dbebec 100644 --- a/src/objects/actions/lib3270/pfkey.c +++ b/src/objects/actions/lib3270/pfkey.c @@ -51,7 +51,6 @@ static void Lib3270PfAction_class_init(Lib3270PfActionClass *klass); static void Lib3270PfAction_init(Lib3270PfAction *action); - static void change_widget(GAction *object, GtkWidget *from, GtkWidget *to); G_DEFINE_TYPE(Lib3270PfAction, Lib3270PfAction, PW3270_TYPE_ACTION); @@ -97,17 +96,6 @@ void Lib3270PfAction_class_init(Lib3270PfActionClass *klass) { klass->parent_class.get_enabled = get_enabled; - klass->parent_class.change_widget = change_widget; - - /* - pw3270ActionClass * action = PW3270_ACTION_CLASS(klass); - - action->get_enabled = get_enabled; - action->change_widget = change_widget; - - action-> - action->get_parameter_type = get_parameter_type; -*/ } @@ -122,14 +110,4 @@ return G_ACTION(g_object_new(PW3270_TYPE_PFKEY_ACTION, NULL)); } - void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) { - - PW3270_ACTION_CLASS(Lib3270PfAction_parent_class)->change_widget(object,from,to); - - // Does the "enabled" state has changed? If yes notify customers. - gboolean enabled = get_enabled(object,to); - if(get_enabled(object,from) != enabled) - pw3270_action_notify_enabled(object); - - } diff --git a/src/objects/actions/lib3270/toggle.c b/src/objects/actions/lib3270/toggle.c index 3a9ade9..8e14813 100644 --- a/src/objects/actions/lib3270/toggle.c +++ b/src/objects/actions/lib3270/toggle.c @@ -58,18 +58,8 @@ G_DEFINE_TYPE(Lib3270ToggleAction, Lib3270ToggleAction, PW3270_TYPE_ACTION); - static gboolean bg_notify_state(GAction *action) { - pw3270_action_notify_state(action); - return FALSE; - } - - static void change_state(H3270 G_GNUC_UNUSED(*hSession), LIB3270_TOGGLE_ID G_GNUC_UNUSED(id), char state, void * action) { - debug("%s: State on action %s is %s", - __FUNCTION__, - g_action_get_name(G_ACTION(action)), - state ? "ON" : "OFF" - ); - g_idle_add((GSourceFunc) bg_notify_state, G_ACTION(action)); + static void change_state(H3270 G_GNUC_UNUSED(*hSession), LIB3270_TOGGLE_ID G_GNUC_UNUSED(id), char G_GNUC_UNUSED(state), void G_GNUC_UNUSED(*action)) { + pw3270_action_notify_state(G_ACTION(action)); } static void change_widget(GAction *object, GtkWidget *from, GtkWidget *to) { @@ -84,8 +74,6 @@ PW3270_ACTION_CLASS(Lib3270ToggleAction_parent_class)->change_widget(object,from,to); - bg_notify_state(G_ACTION(object)); - } static void activate(GAction *action, GVariant *parameter, GtkWidget *terminal) { @@ -130,7 +118,7 @@ action->parent.name = "toggle"; - action->parent.get_state_property = get_state_property; + action->parent.get_state_property = get_state_property; action->parent.activate = activate; action->parent.types.state = G_VARIANT_TYPE_BOOLEAN; diff --git a/src/objects/actions/v3270/property.c b/src/objects/actions/v3270/property.c index 8906e8a..4f74526 100644 --- a/src/objects/actions/v3270/property.c +++ b/src/objects/actions/v3270/property.c @@ -42,6 +42,8 @@ static void v3270PropertyAction_class_init(v3270PropertyActionClass *klass); static void v3270PropertyAction_init(v3270PropertyAction *action); + static GVariant * get_state(GAction *action, GtkWidget *terminal); + G_DEFINE_TYPE(v3270PropertyAction, v3270PropertyAction, PW3270_TYPE_ACTION); @@ -51,17 +53,72 @@ static void v3270PropertyAction_init(v3270PropertyAction *action) { + action->parent.get_state_property = get_state; + } - v3270PropertyAction * v3270_property_action_new(GtkWidget *widget, const gchar *property_name) { + GVariant * get_state(GAction *action, GtkWidget *terminal) { - v3270PropertyAction * action = (v3270PropertyAction *) g_object_new(V3270_TYPE_PROPERTY_ACTION, NULL); + if(!terminal) + return NULL; + + debug("%s",__FUNCTION__); + + v3270PropertyAction * paction = V3270_PROPERTY_ACTION(action); + + GValue value = G_VALUE_INIT; + GVariant *result = NULL; + + g_value_init(&value, paction->pspec->value_type); + g_object_get_property(G_OBJECT(terminal), paction->pspec->name, &value); + + switch(paction->pspec->value_type) { + case G_TYPE_BOOLEAN: + result = g_variant_new_boolean(g_value_get_boolean(&value)); + break; + + case G_TYPE_INT: + result = g_variant_new_int32(g_value_get_int(&value)); + break; + + case G_TYPE_UINT: + result = g_variant_new_uint32(g_value_get_uint(&value)); + debug("state of %s is %u",g_action_get_name(action),g_value_get_uint(&value)); + break; + + case G_TYPE_DOUBLE: + result = g_variant_new_double(g_value_get_double(&value)); + break; + + case G_TYPE_FLOAT: + result = g_variant_new_double(g_value_get_float(&value)); + break; + + case G_TYPE_STRING: + result = g_variant_new_string(g_value_get_string(&value)); + break; + + } + + g_value_unset (&value); + + return result; + + } + + static void activate(GAction *action, GVariant *parameter, GtkWidget *terminal) { + + debug("%s(%s,%p,%p)",__FUNCTION__,g_action_get_name(action),parameter,terminal); + + } - action->pspec = g_object_class_find_property(G_OBJECT_GET_CLASS(widget), property_name); + v3270PropertyAction * v3270_property_action_new(GtkWidget *widget, const gchar *property_name) { + + GParamSpec *pspec = g_object_class_find_property(G_OBJECT_GET_CLASS(widget), property_name); - if(~action->pspec->flags & G_PARAM_READABLE || ~action->pspec->flags & G_PARAM_WRITABLE || action->pspec->flags & G_PARAM_CONSTRUCT_ONLY) { + if(~pspec->flags & G_PARAM_READABLE || ~pspec->flags & G_PARAM_WRITABLE || pspec->flags & G_PARAM_CONSTRUCT_ONLY) { - g_critical( + g_warning( "Property '%s::%s' must be readable, writable, and not construct-only", G_OBJECT_TYPE_NAME(G_OBJECT(widget)), property_name @@ -70,5 +127,52 @@ return NULL; } + // Get state type + const GVariantType * type; + + switch(pspec->value_type) { + case G_TYPE_BOOLEAN: + type = G_VARIANT_TYPE_BOOLEAN; + debug("%s: Type of \"%s\" is %s",__FUNCTION__,property_name,"boolean"); + break; + + case G_TYPE_INT: + type = G_VARIANT_TYPE_INT32; + debug("%s: Type of \"%s\" is %s",__FUNCTION__,property_name,"int32"); + break; + + case G_TYPE_UINT: + type = G_VARIANT_TYPE_UINT32; + debug("%s: Type of \"%s\" is %s",__FUNCTION__,property_name,"uint32"); + break; + + case G_TYPE_DOUBLE: + case G_TYPE_FLOAT: + type = G_VARIANT_TYPE_DOUBLE; + break; + + case G_TYPE_STRING: + type = G_VARIANT_TYPE_STRING; + break; + + default: + g_warning( + "Unable to create action for property '%s::%s' of type '%s'", + g_type_name(pspec->owner_type), + pspec->name, + g_type_name(pspec->value_type) + ); + return NULL; + } + + v3270PropertyAction * action = (v3270PropertyAction *) g_object_new(V3270_TYPE_PROPERTY_ACTION, NULL); + + action->parent.name = pspec->name; + action->parent.types.state = type; + action->parent.types.parameter = type; + action->parent.activate = activate; + action->pspec = pspec; + + pw3270_action_set_terminal_widget(G_ACTION(action), widget); return action; } diff --git a/src/objects/application/application.c b/src/objects/application/application.c index b7ffb2d..f8fd865 100644 --- a/src/objects/application/application.c +++ b/src/objects/application/application.c @@ -33,6 +33,7 @@ #include "private.h" #include + #include enum { PROP_ZERO, @@ -272,11 +273,18 @@ GtkWidget * window = pw3270_application_window_new(GTK_APPLICATION(application)); - // Create terminal widget - pw3270_terminal_new(window); - pw3270_window_set_current_page(window,0); + // Create terminal widget & associated widget + GtkWidget * terminal = pw3270_terminal_new(window); + + GAction * action = G_ACTION(v3270_property_action_new(terminal,"model_number")); + + if(action) { + debug("Adding window action \"%s\"",g_action_get_name(action)); + g_action_map_add_action(G_ACTION_MAP(window),action); + } // Present the new window + pw3270_window_set_current_page(window,0); gtk_window_present(GTK_WINDOW(window)); } diff --git a/ui/application.xml b/ui/application.xml index e26b9df..01392ca 100644 --- a/ui/application.xml +++ b/ui/application.xml @@ -245,19 +245,20 @@ Screen size Model 2 - 80x24 - win.set-model + win.model-number + 2 Model 3 - 80x32 - win.set-model + win.model-number Model 4 - 80x43 - win.set-model + win.model-number Model 5 - 132x27 - win.set-model + win.model-number @@ -266,11 +267,6 @@ Select font - - Screen sizes - win.screen.sizes - - Options -- libgit2 0.21.2