Commit 33cff6e713376fafb7d313086a013e24c413fd0f
1 parent
25d497e8
Exists in
master
and in
1 other branch
Working on load/save settings engine.
Showing
11 changed files
with
75 additions
and
67 deletions
Show diff stats
src/include/terminal.h
... | ... | @@ -33,6 +33,7 @@ |
33 | 33 | |
34 | 34 | G_BEGIN_DECLS |
35 | 35 | |
36 | +/* | |
36 | 37 | /// @brief V3270 Properties saved to the configuration file. |
37 | 38 | typedef enum |
38 | 39 | { |
... | ... | @@ -56,6 +57,7 @@ G_BEGIN_DECLS |
56 | 57 | } V3270_SETTING; |
57 | 58 | |
58 | 59 | G_GNUC_INTERNAL void v3270_notify_setting(GtkWidget *widget, V3270_SETTING id); |
60 | +*/ | |
59 | 61 | |
60 | 62 | struct _v3270Class |
61 | 63 | { |
... | ... | @@ -69,7 +71,7 @@ G_BEGIN_DECLS |
69 | 71 | GParamSpec * toggle[LIB3270_TOGGLE_COUNT]; // Toggle properties. |
70 | 72 | |
71 | 73 | // Properties saved to the configuration file. |
72 | - GParamSpec * settings[V3270_SETTING_COUNT]; | |
74 | + const gchar **persistent; | |
73 | 75 | |
74 | 76 | // Signal related properties |
75 | 77 | GParamSpec * online; |
... | ... | @@ -92,9 +94,6 @@ G_BEGIN_DECLS |
92 | 94 | |
93 | 95 | } properties; |
94 | 96 | |
95 | - // Predefined responses. | |
96 | -// GParamSpec * responses[V3270_TOGGLEABLE_DIALOG_CUSTOM]; | |
97 | - | |
98 | 97 | // Cursors |
99 | 98 | GdkCursor * cursors[LIB3270_POINTER_COUNT]; |
100 | 99 | ... | ... |
src/include/v3270/settings.h
... | ... | @@ -48,7 +48,7 @@ |
48 | 48 | LIB3270_EXPORT void v3270_to_key_file(GtkWidget *widget, GKeyFile *key_file, const gchar *group_name); |
49 | 49 | |
50 | 50 | /// @brief Emit the "save-settings" signal. |
51 | - LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget); | |
51 | + LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget, const gchar *property_name); | |
52 | 52 | |
53 | 53 | #ifdef _WIN32 |
54 | 54 | ... | ... |
src/selection/selection.c
... | ... | @@ -151,7 +151,7 @@ void v3270_selection_set_font_family(GtkWidget *widget, const gchar *name) { |
151 | 151 | terminal->selection.font_family = g_strdup(name); |
152 | 152 | } |
153 | 153 | |
154 | - v3270_emit_save_settings(widget); | |
154 | + v3270_emit_save_settings(widget,NULL); | |
155 | 155 | |
156 | 156 | } |
157 | 157 | |
... | ... | @@ -181,7 +181,7 @@ void v3270_selection_set_color_scheme(GtkWidget *widget, const gchar *name) { |
181 | 181 | terminal->selection.color.scheme = g_strdup(name); |
182 | 182 | } |
183 | 183 | |
184 | - v3270_emit_save_settings(widget); | |
184 | + v3270_emit_save_settings(widget,NULL); | |
185 | 185 | |
186 | 186 | } |
187 | 187 | ... | ... |
src/terminal/callbacks.c
... | ... | @@ -112,7 +112,8 @@ static gboolean v3270_update_url(v3270 *terminal) |
112 | 112 | { |
113 | 113 | GtkWidget * widget = GTK_WIDGET(terminal); |
114 | 114 | debug("url=%s",v3270_get_url(widget)); |
115 | - v3270_notify_setting(widget,V3270_SETTING_URL); | |
115 | + | |
116 | + v3270_emit_save_settings(widget,"url"); | |
116 | 117 | v3270_signal_emit(widget, V3270_SIGNAL_SESSION_CHANGED); |
117 | 118 | return FALSE; |
118 | 119 | } |
... | ... | @@ -201,9 +202,7 @@ static void update_model(H3270 *session, const char *name, int model, G_GNUC_UNU |
201 | 202 | { |
202 | 203 | GtkWidget * widget = GTK_WIDGET(lib3270_get_user_data(session)); |
203 | 204 | |
204 | - debug("%s: terminal=%p pspec=%p",__FUNCTION__,widget,GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_MODEL_NUMBER]); | |
205 | - g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_MODEL_NUMBER]); | |
206 | - | |
205 | +// g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_MODEL_NUMBER]); | |
207 | 206 | v3270_signal_emit(widget,V3270_SIGNAL_MODEL_CHANGED, (guint) model, name); |
208 | 207 | } |
209 | 208 | ... | ... |
src/terminal/charset.c
... | ... | @@ -337,8 +337,7 @@ |
337 | 337 | g_free(cfg.host); |
338 | 338 | g_free(cfg.display); |
339 | 339 | |
340 | - debug("%s=%p",__FUNCTION__,GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_REMAP_FILE]); | |
341 | - v3270_notify_setting(widget,V3270_SETTING_REMAP_FILE); | |
340 | + v3270_emit_save_settings(widget,"remap_file"); | |
342 | 341 | |
343 | 342 | } |
344 | 343 | ... | ... |
src/terminal/colors.c
... | ... | @@ -135,7 +135,7 @@ LIB3270_EXPORT void v3270_set_colors(GtkWidget *widget, const gchar *colors) |
135 | 135 | } |
136 | 136 | |
137 | 137 | v3270_set_color_table(GTK_V3270(widget)->color,colors); |
138 | - v3270_emit_save_settings(widget); | |
138 | + v3270_emit_save_settings(widget,NULL); | |
139 | 139 | v3270_reload(widget); |
140 | 140 | |
141 | 141 | } | ... | ... |
src/terminal/font/properties.c
... | ... | @@ -162,10 +162,7 @@ LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name) |
162 | 162 | terminal->font.family = g_strdup(name); |
163 | 163 | terminal->font.weight = lib3270_get_toggle(terminal->host,LIB3270_TOGGLE_BOLD) ? CAIRO_FONT_WEIGHT_BOLD : CAIRO_FONT_WEIGHT_NORMAL; |
164 | 164 | |
165 | - v3270_emit_save_settings(widget); | |
166 | - | |
167 | - debug("%s: %p",__FUNCTION__,GTK_V3270_GET_CLASS(widget)->properties.settings[V3270_SETTING_FONT_FAMILY]); | |
168 | - v3270_notify_setting(widget,V3270_SETTING_FONT_FAMILY); | |
165 | + v3270_emit_save_settings(widget,"font_family"); | |
169 | 166 | |
170 | 167 | if(gtk_widget_get_realized(widget) && gtk_widget_get_has_window(widget)) |
171 | 168 | { |
... | ... | @@ -177,13 +174,6 @@ LIB3270_EXPORT void v3270_set_font_family(GtkWidget *widget, const gchar *name) |
177 | 174 | |
178 | 175 | } |
179 | 176 | |
180 | -void v3270_notify_setting(GtkWidget *widget, V3270_SETTING id) | |
181 | -{ | |
182 | - debug("%s(%u)",__FUNCTION__,(unsigned int) id); | |
183 | - g_object_notify_by_pspec(G_OBJECT(widget), GTK_V3270_GET_CLASS(widget)->properties.settings[id]); | |
184 | - v3270_emit_save_settings(widget); | |
185 | -} | |
186 | - | |
187 | 177 | LIB3270_EXPORT const gchar * v3270_get_font_family(GtkWidget *widget) |
188 | 178 | { |
189 | 179 | g_return_val_if_fail(GTK_IS_V3270(widget),NULL); | ... | ... |
src/terminal/keyfile.c
... | ... | @@ -308,15 +308,17 @@ |
308 | 308 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) |
309 | 309 | save_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); |
310 | 310 | |
311 | - // Save V3270 Responses | |
312 | - /* | |
313 | - for(ix = 0; ix < G_N_ELEMENTS(terminal->responses); ix++) | |
314 | - save_by_pspec(widget,klass->responses[ix],key_file,group_name); | |
315 | - */ | |
316 | - | |
317 | 311 | // Save V3270 properties |
318 | - for(ix = 0; ix < V3270_SETTING_COUNT; ix++) | |
319 | - save_by_pspec(widget,klass->properties.settings[ix],key_file,group_name); | |
312 | + for(ix = 0; klass->properties.persistent[ix];ix++) | |
313 | + { | |
314 | + save_by_pspec( | |
315 | + widget, | |
316 | + g_object_class_find_property(G_OBJECT_CLASS(klass),klass->properties.persistent[ix]), | |
317 | + key_file, | |
318 | + group_name | |
319 | + ); | |
320 | + | |
321 | + } | |
320 | 322 | |
321 | 323 | } |
322 | 324 | |
... | ... | @@ -362,15 +364,17 @@ |
362 | 364 | for(ix = 0; ix < G_N_ELEMENTS(klass->properties.toggle); ix++) |
363 | 365 | load_by_pspec(widget,klass->properties.toggle[ix],key_file,group_name); |
364 | 366 | |
365 | - /* | |
366 | - // Load V3270 Responses | |
367 | - for(ix = 0; ix < G_N_ELEMENTS(terminal->responses); ix++) | |
368 | - load_by_pspec(widget,klass->responses[ix],key_file,group_name); | |
369 | - */ | |
370 | - | |
371 | 367 | // Load V3270 properties |
372 | - for(ix = 0; ix < V3270_SETTING_COUNT; ix++) | |
373 | - load_by_pspec(widget,klass->properties.settings[ix],key_file,group_name); | |
368 | + for(ix = 0; klass->properties.persistent[ix];ix++) | |
369 | + { | |
370 | + load_by_pspec( | |
371 | + widget, | |
372 | + g_object_class_find_property(G_OBJECT_CLASS(klass),klass->properties.persistent[ix]), | |
373 | + key_file, | |
374 | + group_name | |
375 | + ); | |
376 | + | |
377 | + } | |
374 | 378 | |
375 | 379 | g_object_thaw_notify(G_OBJECT(widget)); |
376 | 380 | terminal->freeze = 0; | ... | ... |
src/terminal/properties/init.c
... | ... | @@ -43,15 +43,7 @@ |
43 | 43 | } properties[] = { |
44 | 44 | { "connected", &klass->properties.online }, |
45 | 45 | { "associated-lu", &klass->properties.associated_lu }, |
46 | - { "url", &klass->properties.settings[V3270_SETTING_URL] }, | |
47 | - { "model-number", &klass->properties.settings[V3270_SETTING_MODEL_NUMBER] }, | |
48 | 46 | { "has-selection", &klass->properties.selection }, |
49 | - { "oversize", &klass->properties.settings[V3270_SETTING_OVERSIZE] }, | |
50 | - { "host-charset", &klass->properties.settings[V3270_SETTING_HOST_CHARSET] }, | |
51 | - { "unlock-delay", &klass->properties.settings[V3270_SETTING_UNLOCK_DELAY] }, | |
52 | - { "color-type", &klass->properties.settings[V3270_SETTING_COLOR_TYPE] }, | |
53 | - { "host-type", &klass->properties.settings[V3270_SETTING_HOST_TYPE] }, | |
54 | - { "crl-preferred-protocol", &klass->properties.settings[V3270_SETTING_CRL_PROTOCOL] }, | |
55 | 47 | }; |
56 | 48 | |
57 | 49 | size_t ix; |
... | ... | @@ -83,7 +75,7 @@ |
83 | 75 | // Setup internal properties. |
84 | 76 | |
85 | 77 | // Font family |
86 | - klass->properties.settings[V3270_SETTING_FONT_FAMILY] = | |
78 | + spec = | |
87 | 79 | g_param_spec_string( |
88 | 80 | "font_family", |
89 | 81 | "font_family", |
... | ... | @@ -95,7 +87,7 @@ |
95 | 87 | g_object_class_install_property( |
96 | 88 | gobject_class, |
97 | 89 | V3270_PROPERTY_FONT_FAMILY, |
98 | - klass->properties.settings[V3270_SETTING_FONT_FAMILY] | |
90 | + spec | |
99 | 91 | ); |
100 | 92 | |
101 | 93 | // Session name. |
... | ... | @@ -114,7 +106,7 @@ |
114 | 106 | ); |
115 | 107 | |
116 | 108 | // Auto disconnect |
117 | - klass->properties.settings[V3270_SETTING_AUTO_DISCONNECT] = | |
109 | + spec = | |
118 | 110 | g_param_spec_uint( |
119 | 111 | "auto_disconnect", |
120 | 112 | "auto_disconnect", |
... | ... | @@ -128,7 +120,7 @@ |
128 | 120 | g_object_class_install_property( |
129 | 121 | gobject_class, |
130 | 122 | V3270_PROPERTY_AUTO_DISCONNECT, |
131 | - klass->properties.settings[V3270_SETTING_AUTO_DISCONNECT] | |
123 | + spec | |
132 | 124 | ); |
133 | 125 | |
134 | 126 | // Clipboard |
... | ... | @@ -147,7 +139,7 @@ |
147 | 139 | ); |
148 | 140 | |
149 | 141 | // Remap file |
150 | - klass->properties.settings[V3270_SETTING_REMAP_FILE] = | |
142 | + spec = | |
151 | 143 | g_param_spec_string( |
152 | 144 | "remap_file", |
153 | 145 | "remap_file", |
... | ... | @@ -159,11 +151,11 @@ |
159 | 151 | g_object_class_install_property( |
160 | 152 | gobject_class, |
161 | 153 | V3270_PROPERTY_REMAP_FILE, |
162 | - klass->properties.settings[V3270_SETTING_REMAP_FILE] | |
154 | + spec | |
163 | 155 | ); |
164 | 156 | |
165 | 157 | // Dynamic font spacing |
166 | - klass->properties.settings[V3270_SETTING_DYNAMIC_SPACING] = | |
158 | + spec = | |
167 | 159 | g_param_spec_boolean( |
168 | 160 | "dynamic_font_spacing", |
169 | 161 | "dynamic_font_spacing", |
... | ... | @@ -175,11 +167,11 @@ |
175 | 167 | g_object_class_install_property( |
176 | 168 | gobject_class, |
177 | 169 | V3270_PROPERTY_DYNAMIC_SPACING, |
178 | - klass->properties.settings[V3270_SETTING_DYNAMIC_SPACING] | |
170 | + spec | |
179 | 171 | ); |
180 | 172 | |
181 | 173 | // Lu names |
182 | - klass->properties.settings[V3270_SETTING_LU_NAMES] = | |
174 | + spec = | |
183 | 175 | g_param_spec_string( |
184 | 176 | "lu_names", |
185 | 177 | "lu_names", |
... | ... | @@ -191,7 +183,7 @@ |
191 | 183 | g_object_class_install_property( |
192 | 184 | gobject_class, |
193 | 185 | V3270_PROPERTY_LU_NAMES, |
194 | - klass->properties.settings[V3270_SETTING_LU_NAMES] | |
186 | + spec | |
195 | 187 | ); |
196 | 188 | |
197 | 189 | // Trace |
... | ... | @@ -209,7 +201,7 @@ |
209 | 201 | ); |
210 | 202 | |
211 | 203 | // Colors |
212 | - klass->properties.settings[V3270_SETTING_TERMINAL_COLORS] = | |
204 | + spec = | |
213 | 205 | g_param_spec_string( |
214 | 206 | "colors", |
215 | 207 | "colors", |
... | ... | @@ -221,11 +213,11 @@ |
221 | 213 | g_object_class_install_property( |
222 | 214 | gobject_class, |
223 | 215 | V3270_PROPERTY_TERMINAL_COLORS, |
224 | - klass->properties.settings[V3270_SETTING_TERMINAL_COLORS] | |
216 | + spec | |
225 | 217 | ); |
226 | 218 | |
227 | 219 | // Clipboard options |
228 | - klass->properties.settings[V3270_SETTING_SELECTION_OPTIONS] = | |
220 | + spec = | |
229 | 221 | g_param_spec_uint( |
230 | 222 | "selection_flags", |
231 | 223 | "selection_flags", |
... | ... | @@ -239,7 +231,7 @@ |
239 | 231 | g_object_class_install_property( |
240 | 232 | gobject_class, |
241 | 233 | V3270_PROPERTY_SELECTION_OPTIONS, |
242 | - klass->properties.settings[V3270_SETTING_SELECTION_OPTIONS] | |
234 | + spec | |
243 | 235 | ); |
244 | 236 | |
245 | 237 | klass->properties.has_copy = | ... | ... |
src/terminal/properties/set.c
... | ... | @@ -256,7 +256,7 @@ LIB3270_EXPORT void v3270_set_auto_disconnect(GtkWidget *widget, guint minutes) |
256 | 256 | if(terminal->activity.disconnect != minutes) |
257 | 257 | { |
258 | 258 | terminal->activity.disconnect = minutes; |
259 | - v3270_notify_setting(widget,V3270_SETTING_AUTO_DISCONNECT); | |
259 | + v3270_emit_save_settings(widget,"auto_disconnect"); | |
260 | 260 | } |
261 | 261 | |
262 | 262 | } |
... | ... | @@ -273,7 +273,7 @@ LIB3270_EXPORT void v3270_set_dynamic_font_spacing(GtkWidget *widget, gboolean s |
273 | 273 | terminal->font.spacing.dynamic = state; |
274 | 274 | v3270_reconfigure(terminal); |
275 | 275 | gtk_widget_queue_draw(widget); |
276 | - v3270_notify_setting(widget,V3270_SETTING_DYNAMIC_SPACING); | |
276 | + v3270_emit_save_settings(widget,"dynamic_font_spacing"); | |
277 | 277 | } |
278 | 278 | |
279 | 279 | } |
... | ... | @@ -282,6 +282,6 @@ LIB3270_EXPORT void v3270_set_lunames(GtkWidget *widget, const gchar *lunames) |
282 | 282 | { |
283 | 283 | g_return_if_fail(GTK_IS_V3270(widget)); |
284 | 284 | lib3270_set_lunames(GTK_V3270(widget)->host,(lunames && *lunames ? lunames : NULL)); |
285 | - v3270_notify_setting(widget,V3270_SETTING_LU_NAMES); | |
285 | + v3270_emit_save_settings(widget,"lu_names"); | |
286 | 286 | } |
287 | 287 | ... | ... |
src/terminal/widget.c
... | ... | @@ -58,6 +58,26 @@ |
58 | 58 | * |
59 | 59 | */ |
60 | 60 | |
61 | +/// @brief Persistent properties (load/save from session file). | |
62 | +static const gchar *persistent_properties[] = { | |
63 | + "url", | |
64 | + "model-number", | |
65 | + "oversize", | |
66 | + "host-charset", | |
67 | + "unlock-delay", | |
68 | + "color-type", | |
69 | + "host-type", | |
70 | + "crl-preferred-protocol", | |
71 | + "remap_file", | |
72 | + "dynamic_font_spacing", | |
73 | + "lu_names", | |
74 | + "font_family", | |
75 | + "auto_disconnect", | |
76 | + "colors", | |
77 | + "selection_flags", | |
78 | + NULL | |
79 | +}; | |
80 | + | |
61 | 81 | /*--[ Widget definition ]----------------------------------------------------------------------------*/ |
62 | 82 | |
63 | 83 | G_DEFINE_TYPE(v3270, v3270, GTK_TYPE_WIDGET); |
... | ... | @@ -207,6 +227,8 @@ static void finalize(GObject *object) { |
207 | 227 | GtkWidgetClass * widget_class = GTK_WIDGET_CLASS(klass); |
208 | 228 | GtkBindingSet * binding = gtk_binding_set_by_class(klass); |
209 | 229 | |
230 | + klass->properties.persistent = persistent_properties; | |
231 | + | |
210 | 232 | // Setup widget key bindings |
211 | 233 | gtk_binding_entry_skip(binding,GDK_F10,0); |
212 | 234 | |
... | ... | @@ -824,8 +846,11 @@ static gboolean bg_emit_save_settings(v3270 *terminal) |
824 | 846 | return FALSE; |
825 | 847 | } |
826 | 848 | |
827 | -LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget) | |
849 | +LIB3270_EXPORT void v3270_emit_save_settings(GtkWidget *widget, const gchar *property_name) | |
828 | 850 | { |
851 | + if(property_name) | |
852 | + g_object_notify(G_OBJECT(widget),property_name); | |
853 | + | |
829 | 854 | debug("%s(Freeze is %s)",__FUNCTION__,GTK_V3270(widget)->freeze ? "ON" : "OFF"); |
830 | 855 | if(widget && GTK_IS_V3270(widget) && !GTK_V3270(widget)->freeze) |
831 | 856 | { | ... | ... |