diff --git a/src/include/terminal.h b/src/include/terminal.h index ba27cbc..7e50fdb 100644 --- a/src/include/terminal.h +++ b/src/include/terminal.h @@ -33,6 +33,7 @@ G_BEGIN_DECLS +/* /// @brief V3270 Properties saved to the configuration file. typedef enum { @@ -56,6 +57,7 @@ G_BEGIN_DECLS } V3270_SETTING; G_GNUC_INTERNAL void v3270_notify_setting(GtkWidget *widget, V3270_SETTING id); +*/ struct _v3270Class { @@ -69,7 +71,7 @@ G_BEGIN_DECLS GParamSpec * toggle[LIB3270_TOGGLE_COUNT]; // Toggle properties. // Properties saved to the configuration file. - GParamSpec * settings[V3270_SETTING_COUNT]; + const gchar **persistent; // Signal related properties GParamSpec * online; @@ -92,9 +94,6 @@ G_BEGIN_DECLS } properties; - // Predefined responses. -// GParamSpec * responses[V3270_TOGGLEABLE_DIALOG_CUSTOM]; - // Cursors GdkCursor * cursors[LIB3270_POINTER_COUNT]; diff --git a/src/include/v3270/settings.h b/src/include/v3270/settings.h index 04f9714..a73f649 100644 --- a/src/include/v3270/settings.h +++ b/src/include/v3270/settings.h @@ -48,7 +48,7 @@ LIB3270_EXPORT void v3270_to_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name); /// @brief Emit the "save-settings" signal. - LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget); + LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget, const gchar *property_name); #ifdef _WIN32 diff --git a/src/selection/selection.c b/src/selection/selection.c index ad8bfaf..c6e79c6 100644 --- a/src/selection/selection.c +++ b/src/selection/selection.c @@ -151,7 +151,7 @@ void v3270_selection_set_font_family(GtkWidget *widget, const gchar *name) { terminal->selection.font_family = g_strdup(name); } - v3270_emit_save_settings(widget); + v3270_emit_save_settings(widget,NULL); } @@ -181,7 +181,7 @@ void v3270_selection_set_color_scheme(GtkWidget *widget, const gchar *name) { terminal->selection.color.scheme = g_strdup(name); } - v3270_emit_save_settings(widget); + v3270_emit_save_settings(widget,NULL); } diff --git a/src/terminal/callbacks.c b/src/terminal/callbacks.c index b397c39..0aa1968 100644 --- a/src/terminal/callbacks.c +++ b/src/terminal/callbacks.c @@ -112,7 +112,8 @@ static gboolean v3270_update_url(v3270 *terminal) { GtkWidget * widget = GTK_WIDGET(terminal); debug("url=%s",v3270_get_url(widget)); - v3270_notify_setting(widget,V3270_SETTING_URL); + + v3270_emit_save_settings(widget,"url"); v3270_signal_emit(widget, V3270_SIGNAL_SESSION_CHANGED); return FALSE; } @@ -201,9 +202,7 @@ static void update_model(H3270 *session, const char *name, int model, G_GNUC_UNU { GtkWidget * widget = GTK_WIDGET(lib3270_get_user_data(session)); - debug("%s: terminal=%p pspec=%p",__FUNCTION__,widget,GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_MODEL_NUMBER]); - g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_MODEL_NUMBER]); - +// g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_MODEL_NUMBER]); v3270_signal_emit(widget,V3270_SIGNAL_MODEL_CHANGED, (guint) model, name); } diff --git a/src/terminal/charset.c b/src/terminal/charset.c index c7ce0d8..19a7426 100644 --- a/src/terminal/charset.c +++ b/src/terminal/charset.c @@ -337,8 +337,7 @@ g_free(cfg.host); g_free(cfg.display); - debug("%s=%p",__FUNCTION__,GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_REMAP_FILE]); - v3270_notify_setting(widget,V3270_SETTING_REMAP_FILE); + v3270_emit_save_settings(widget,"remap_file"); } diff --git a/src/terminal/colors.c b/src/terminal/colors.c index 6e177b5..f2fcdfa 100644 --- a/src/terminal/colors.c +++ b/src/terminal/colors.c @@ -135,7 +135,7 @@ LIB3270_EXPORT void v3270_set_colors(GtkWidget *widget, const gchar *colors) } v3270_set_color_table(GTK_V3270(widget)->color,colors); - v3270_emit_save_settings(widget); + v3270_emit_save_settings(widget,NULL); v3270_reload(widget); } diff --git a/src/terminal/font/properties.c b/src/terminal/font/properties.c index 81876e8..f095875 100644 --- a/src/terminal/font/properties.c +++ b/src/terminal/font/properties.c @@ -162,10 +162,7 @@ LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name) terminal->font.family = g_strdup(name); terminal->font.weight = lib3270_get_toggle(terminal->host,LIB3270_TOGGLE_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; - v3270_emit_save_settings(widget); - - debug("%s: %p",__FUNCTION__,GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_FONT_FAMILY]); - v3270_notify_setting(widget,V3270_SETTING_FONT_FAMILY); + v3270_emit_save_settings(widget,"font_family"); if(gtk_widget_get_realized(widget) && gtk_widget_get_has_window(widget)) { @@ -177,13 +174,6 @@ LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name) } -void v3270_notify_setting(GtkWidget *widget, V3270_SETTING id) -{ - debug("%s(%u)",__FUNCTION__,(unsigned int) id); - g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.settings[id]); - v3270_emit_save_settings(widget); -} - LIB3270_EXPORT const gchar * v3270_get_font_family(GtkWidget *widget) { g_return_val_if_fail(GTK_IS_V3270(widget),NULL); diff --git a/src/terminal/keyfile.c b/src/terminal/keyfile.c index ed17bb3..d9bab66 100644 --- a/src/terminal/keyfile.c +++ b/src/terminal/keyfile.c @@ -308,15 +308,17 @@ for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) save_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); - // Save V3270 Responses - /* - for(ix = 0; ix < G_N_ELEMENTS(terminal->responses); ix++) - save_by_pspec(widget,klass->responses[ix],key_file,group_name); - */ - // Save V3270 properties - for(ix = 0; ix < V3270_SETTING_COUNT; ix++) - save_by_pspec(widget,klass->properties.settings[ix],key_file,group_name); + for(ix = 0; klass->properties.persistent[ix];ix++) + { + save_by_pspec( + widget, + g_object_class_find_property(G_OBJECT_CLASS(klass),klass->properties.persistent[ix]), + key_file, + group_name + ); + + } } @@ -362,15 +364,17 @@ for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) load_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); - /* - // Load V3270 Responses - for(ix = 0; ix < G_N_ELEMENTS(terminal->responses); ix++) - load_by_pspec(widget,klass->responses[ix],key_file,group_name); - */ - // Load V3270 properties - for(ix = 0; ix < V3270_SETTING_COUNT; ix++) - load_by_pspec(widget,klass->properties.settings[ix],key_file,group_name); + for(ix = 0; klass->properties.persistent[ix];ix++) + { + load_by_pspec( + widget, + g_object_class_find_property(G_OBJECT_CLASS(klass),klass->properties.persistent[ix]), + key_file, + group_name + ); + + } g_object_thaw_notify(G_OBJECT(widget)); terminal->freeze = 0; diff --git a/src/terminal/properties/init.c b/src/terminal/properties/init.c index 34996ed..6e1aa73 100644 --- a/src/terminal/properties/init.c +++ b/src/terminal/properties/init.c @@ -43,15 +43,7 @@ } properties[] = { { "connected", &klass->properties.online }, { "associated-lu", &klass->properties.associated_lu }, - { "url", &klass->properties.settings[V3270_SETTING_URL] }, - { "model-number", &klass->properties.settings[V3270_SETTING_MODEL_NUMBER] }, { "has-selection", &klass->properties.selection }, - { "oversize", &klass->properties.settings[V3270_SETTING_OVERSIZE] }, - { "host-charset", &klass->properties.settings[V3270_SETTING_HOST_CHARSET] }, - { "unlock-delay", &klass->properties.settings[V3270_SETTING_UNLOCK_DELAY] }, - { "color-type", &klass->properties.settings[V3270_SETTING_COLOR_TYPE] }, - { "host-type", &klass->properties.settings[V3270_SETTING_HOST_TYPE] }, - { "crl-preferred-protocol", &klass->properties.settings[V3270_SETTING_CRL_PROTOCOL] }, }; size_t ix; @@ -83,7 +75,7 @@ // Setup internal properties. // Font family - klass->properties.settings[V3270_SETTING_FONT_FAMILY] = + spec = g_param_spec_string( "font_family", "font_family", @@ -95,7 +87,7 @@ g_object_class_install_property( gobject_class, V3270_PROPERTY_FONT_FAMILY, - klass->properties.settings[V3270_SETTING_FONT_FAMILY] + spec ); // Session name. @@ -114,7 +106,7 @@ ); // Auto disconnect - klass->properties.settings[V3270_SETTING_AUTO_DISCONNECT] = + spec = g_param_spec_uint( "auto_disconnect", "auto_disconnect", @@ -128,7 +120,7 @@ g_object_class_install_property( gobject_class, V3270_PROPERTY_AUTO_DISCONNECT, - klass->properties.settings[V3270_SETTING_AUTO_DISCONNECT] + spec ); // Clipboard @@ -147,7 +139,7 @@ ); // Remap file - klass->properties.settings[V3270_SETTING_REMAP_FILE] = + spec = g_param_spec_string( "remap_file", "remap_file", @@ -159,11 +151,11 @@ g_object_class_install_property( gobject_class, V3270_PROPERTY_REMAP_FILE, - klass->properties.settings[V3270_SETTING_REMAP_FILE] + spec ); // Dynamic font spacing - klass->properties.settings[V3270_SETTING_DYNAMIC_SPACING] = + spec = g_param_spec_boolean( "dynamic_font_spacing", "dynamic_font_spacing", @@ -175,11 +167,11 @@ g_object_class_install_property( gobject_class, V3270_PROPERTY_DYNAMIC_SPACING, - klass->properties.settings[V3270_SETTING_DYNAMIC_SPACING] + spec ); // Lu names - klass->properties.settings[V3270_SETTING_LU_NAMES] = + spec = g_param_spec_string( "lu_names", "lu_names", @@ -191,7 +183,7 @@ g_object_class_install_property( gobject_class, V3270_PROPERTY_LU_NAMES, - klass->properties.settings[V3270_SETTING_LU_NAMES] + spec ); // Trace @@ -209,7 +201,7 @@ ); // Colors - klass->properties.settings[V3270_SETTING_TERMINAL_COLORS] = + spec = g_param_spec_string( "colors", "colors", @@ -221,11 +213,11 @@ g_object_class_install_property( gobject_class, V3270_PROPERTY_TERMINAL_COLORS, - klass->properties.settings[V3270_SETTING_TERMINAL_COLORS] + spec ); // Clipboard options - klass->properties.settings[V3270_SETTING_SELECTION_OPTIONS] = + spec = g_param_spec_uint( "selection_flags", "selection_flags", @@ -239,7 +231,7 @@ g_object_class_install_property( gobject_class, V3270_PROPERTY_SELECTION_OPTIONS, - klass->properties.settings[V3270_SETTING_SELECTION_OPTIONS] + spec ); klass->properties.has_copy = diff --git a/src/terminal/properties/set.c b/src/terminal/properties/set.c index 784169c..04894ab 100644 --- a/src/terminal/properties/set.c +++ b/src/terminal/properties/set.c @@ -256,7 +256,7 @@ LIB3270_EXPORT void v3270_set_auto_disconnect(GtkWidget *widget, guint minutes) if(terminal->activity.disconnect != minutes) { terminal->activity.disconnect = minutes; - v3270_notify_setting(widget,V3270_SETTING_AUTO_DISCONNECT); + v3270_emit_save_settings(widget,"auto_disconnect"); } } @@ -273,7 +273,7 @@ LIB3270_EXPORT void v3270_set_dynamic_font_spacing(GtkWidget *widget, gboolean s terminal->font.spacing.dynamic = state; v3270_reconfigure(terminal); gtk_widget_queue_draw(widget); - v3270_notify_setting(widget,V3270_SETTING_DYNAMIC_SPACING); + v3270_emit_save_settings(widget,"dynamic_font_spacing"); } } @@ -282,6 +282,6 @@ LIB3270_EXPORT void v3270_set_lunames(GtkWidget *widget, const gchar *lunames) { g_return_if_fail(GTK_IS_V3270(widget)); lib3270_set_lunames(GTK_V3270(widget)->host,(lunames && *lunames ? lunames : NULL)); - v3270_notify_setting(widget,V3270_SETTING_LU_NAMES); + v3270_emit_save_settings(widget,"lu_names"); } diff --git a/src/terminal/widget.c b/src/terminal/widget.c index 3024297..daafee1 100644 --- a/src/terminal/widget.c +++ b/src/terminal/widget.c @@ -58,6 +58,26 @@ * */ +/// @brief Persistent properties (load/save from session file). +static const gchar *persistent_properties[] = { + "url", + "model-number", + "oversize", + "host-charset", + "unlock-delay", + "color-type", + "host-type", + "crl-preferred-protocol", + "remap_file", + "dynamic_font_spacing", + "lu_names", + "font_family", + "auto_disconnect", + "colors", + "selection_flags", + NULL +}; + /*--[ Widget definition ]----------------------------------------------------------------------------*/ G_DEFINE_TYPE(v3270, v3270, GTK_TYPE_WIDGET); @@ -207,6 +227,8 @@ static void finalize(GObject *object) { GtkWidgetClass * widget_class = GTK_WIDGET_CLASS(klass); GtkBindingSet * binding = gtk_binding_set_by_class(klass); + klass->properties.persistent = persistent_properties; + // Setup widget key bindings gtk_binding_entry_skip(binding,GDK_F10,0); @@ -824,8 +846,11 @@ static gboolean bg_emit_save_settings(v3270 *terminal) return FALSE; } -LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget) +LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget, const gchar *property_name) { + if(property_name) + g_object_notify(G_OBJECT(widget),property_name); + debug("%s(Freeze is %s)",__FUNCTION__,GTK_V3270(widget)->freeze ? "ON" : "OFF"); if(widget && GTK_IS_V3270(widget) && !GTK_V3270(widget)->freeze) { -- libgit2 0.21.2