1 /*
2 Gpredict: Real-time satellite tracking and orbit prediction program
3
4 Copyright (C) 2001-2017 Alexandru Csete, OZ9AEC
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, visit http://www.fsf.org/
18 */
19 #ifdef HAVE_CONFIG_H
20 #include <build-config.h>
21 #endif
22 #include <glib/gi18n.h>
23 #include <gtk/gtk.h>
24
25 #include "config-keys.h"
26 #include "gpredict-utils.h"
27 #include "gtk-polar-view.h"
28 #include "mod-cfg-get-param.h"
29 #include "sat-cfg.h"
30 #include "sat-log.h"
31 #include "sat-pref-polar-view.h"
32
33 /* orientation selectors */
34 static GtkWidget *nesw, *nwse, *senw, *swne;
35
36 /* content selectors */
37 static GtkWidget *qth, *next, *curs, *xtick;
38
39 /* colour selectors */
40 static GtkWidget *bgd, *axis, *tick, *sat, *ssat, *track, *info;
41
42 /* Misc */
43 static GtkWidget *showtrack;
44
45 /* misc bookkeeping */
46 static gint orient = POLAR_VIEW_NESW;
47 static gboolean dirty = FALSE;
48 static gboolean reset = FALSE;
49
50
51 /**
52 * Manage orientation changes.
53 *
54 * @param but the button that received the signal
55 * @param data User data (always NULL).
56 *
57 * Note that this function is called also for the button that is unchecked,
58 *
59 */
orient_chganged(GtkToggleButton * but,gpointer data)60 static void orient_chganged(GtkToggleButton * but, gpointer data)
61 {
62 if (gtk_toggle_button_get_active(but))
63 {
64 orient = GPOINTER_TO_INT(data);
65 dirty = TRUE;
66 }
67 }
68
69 /**
70 * Manage check-box actions.
71 *
72 * @param but The check-button that has been toggled.
73 * @param daya User data (always NULL).
74 *
75 * We don't need to do anything but set the dirty flag since the values can
76 * always be obtained from the global widgets.
77 */
content_changed(GtkToggleButton * but,gpointer data)78 static void content_changed(GtkToggleButton * but, gpointer data)
79 {
80 (void)but;
81 (void)data;
82
83 dirty = TRUE;
84 }
85
86 /**
87 * Manage color and font changes.
88 *
89 * @param but The color/font picker button that received the signal.
90 * @param data User data (always NULL).
91 *
92 * We don't need to do anything but set the dirty flag since the values can
93 * always be obtained from the global widgets.
94 */
colour_changed(GtkWidget * but,gpointer data)95 static void colour_changed(GtkWidget * but, gpointer data)
96 {
97 (void)but;
98 (void)data;
99
100 dirty = TRUE;
101 }
102
103 /**
104 * Manage RESET button signals.
105 *
106 * @param button The RESET button.
107 * @param cfg Pointer to the module configuration or NULL in global mode.
108 *
109 * This function is called when the user clicks on the RESET button. In global mode
110 * (when cfg = NULL) the function will reset the settings to the efault values, while
111 * in "local" mode (when cfg != NULL) the function will reset the module settings to
112 * the global settings. This is done by removing the corresponding key from the GKeyFile.
113 */
reset_cb(GtkWidget * button,gpointer cfg)114 static void reset_cb(GtkWidget * button, gpointer cfg)
115 {
116 guint cfg_rgba; /* 0xRRGGBBAA encoded color */
117 GdkRGBA gdk_rgba;
118
119 (void)button;
120
121 if (cfg == NULL)
122 {
123 /* global mode, get defaults */
124
125 /* extra contents */
126 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(qth),
127 sat_cfg_get_bool_def
128 (SAT_CFG_BOOL_POL_SHOW_QTH_INFO));
129 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(next),
130 sat_cfg_get_bool_def
131 (SAT_CFG_BOOL_POL_SHOW_NEXT_EV));
132 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(curs),
133 sat_cfg_get_bool_def
134 (SAT_CFG_BOOL_POL_SHOW_CURS_TRACK));
135 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xtick),
136 sat_cfg_get_bool_def
137 (SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS));
138
139 /* colours */
140 cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_BGD_COL);
141 rgba_from_cfg(cfg_rgba, &gdk_rgba);
142 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(bgd), &gdk_rgba);
143
144 cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_AXIS_COL);
145 rgba_from_cfg(cfg_rgba, &gdk_rgba);
146 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(axis), &gdk_rgba);
147
148 cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_TICK_COL);
149 rgba_from_cfg(cfg_rgba, &gdk_rgba);
150 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(tick), &gdk_rgba);
151
152 cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_SAT_COL);
153 rgba_from_cfg(cfg_rgba, &gdk_rgba);
154 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(sat), &gdk_rgba);
155
156 cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_SAT_SEL_COL);
157 rgba_from_cfg(cfg_rgba, &gdk_rgba);
158 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(ssat), &gdk_rgba);
159
160 cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_TRACK_COL);
161 rgba_from_cfg(cfg_rgba, &gdk_rgba);
162 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(track), &gdk_rgba);
163
164 cfg_rgba = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_INFO_COL);
165 rgba_from_cfg(cfg_rgba, &gdk_rgba);
166 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(info), &gdk_rgba);
167
168 /* misc */
169 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showtrack),
170 sat_cfg_get_bool_def
171 (SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO));
172 }
173 else
174 {
175 /* local mode, get global value */
176
177 /* extra contents */
178 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(qth),
179 sat_cfg_get_bool
180 (SAT_CFG_BOOL_POL_SHOW_QTH_INFO));
181 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(next),
182 sat_cfg_get_bool
183 (SAT_CFG_BOOL_POL_SHOW_NEXT_EV));
184 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(curs),
185 sat_cfg_get_bool
186 (SAT_CFG_BOOL_POL_SHOW_CURS_TRACK));
187 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xtick),
188 sat_cfg_get_bool
189 (SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS));
190
191 /* colours */
192 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_BGD_COL);
193 rgba_from_cfg(cfg_rgba, &gdk_rgba);
194 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(bgd), &gdk_rgba);
195
196 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_AXIS_COL);
197 rgba_from_cfg(cfg_rgba, &gdk_rgba);
198 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(axis), &gdk_rgba);
199
200 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_TICK_COL);
201 rgba_from_cfg(cfg_rgba, &gdk_rgba);
202 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(tick), &gdk_rgba);
203
204 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_SAT_COL);
205 rgba_from_cfg(cfg_rgba, &gdk_rgba);
206 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(sat), &gdk_rgba);
207
208 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_SAT_SEL_COL);
209 rgba_from_cfg(cfg_rgba, &gdk_rgba);
210 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(ssat), &gdk_rgba);
211
212 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_TRACK_COL);
213 rgba_from_cfg(cfg_rgba, &gdk_rgba);
214 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(track), &gdk_rgba);
215
216 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_INFO_COL);
217 rgba_from_cfg(cfg_rgba, &gdk_rgba);
218 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(info), &gdk_rgba);
219
220 /* misc */
221 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showtrack),
222 sat_cfg_get_bool
223 (SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO));
224 }
225
226 /* orientation needs some special attention */
227 if (cfg == NULL)
228 {
229 orient = sat_cfg_get_int_def(SAT_CFG_INT_POLAR_ORIENTATION);
230 }
231 else
232 {
233 orient = sat_cfg_get_int(SAT_CFG_INT_POLAR_ORIENTATION);
234 }
235
236 switch (orient)
237 {
238
239 case POLAR_VIEW_NESW:
240 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nesw), TRUE);
241 break;
242
243 case POLAR_VIEW_NWSE:
244 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nwse), TRUE);
245 break;
246
247 case POLAR_VIEW_SENW:
248 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(senw), TRUE);
249 break;
250
251 case POLAR_VIEW_SWNE:
252 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(swne), TRUE);
253 break;
254
255 default:
256 sat_log_log(SAT_LOG_LEVEL_ERROR,
257 _("%s:%s: Invalid chart orientation %d (using N/E/S/W)"),
258 __FILE__, __func__, orient);
259 orient = POLAR_VIEW_NESW;
260 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nesw), TRUE);
261 break;
262 }
263
264 /* reset flags */
265 reset = TRUE;
266 dirty = FALSE;
267 }
268
269
270 /**
271 * Create orientation chooser.
272 *
273 * @param cfg The module configuration or NULL in global mode.
274 * @param vbox The container box in which the widgets should be packed into.
275 *
276 * The orientation selector consists of a radio-group having four radio
277 * buttons: N/E/S/W, N/W/S/E, S/E/N/W, and S/W/N/E
278 */
create_orient_selector(GKeyFile * cfg,GtkBox * vbox)279 static void create_orient_selector(GKeyFile * cfg, GtkBox * vbox)
280 {
281 GtkWidget *label;
282 GtkWidget *hbox;
283
284 /* create header */
285 label = gtk_label_new(NULL);
286 g_object_set(label, "xalign", 0.0f, "yalign", 0.5f, NULL);
287 gtk_label_set_markup(GTK_LABEL(label), _("<b>Orientation:</b>"));
288 gtk_box_pack_start(vbox, label, FALSE, TRUE, 0);
289
290 /* horizontal box to contain the radio buttons */
291 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
292 gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE);
293 gtk_box_pack_start(vbox, hbox, FALSE, TRUE, 0);
294
295 /* N/E/S/W */
296 nesw = gtk_radio_button_new_with_label(NULL, _("N/E/S/W"));
297 gtk_box_pack_start(GTK_BOX(hbox), nesw, FALSE, TRUE, 0);
298 gtk_widget_set_tooltip_text(nesw, _("\tN\n" "W\t\tE\n" "\tS"));
299
300 /* N/W/S/E */
301 nwse =
302 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(nesw),
303 _("N/W/S/E"));
304 gtk_box_pack_start(GTK_BOX(hbox), nwse, FALSE, TRUE, 0);
305 gtk_widget_set_tooltip_text(nwse, _("\tN\n" "E\t\tW\n" "\tS"));
306 /* S/E/N/W */
307 senw =
308 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(nesw),
309 _("S/E/N/W"));
310 gtk_box_pack_start(GTK_BOX(hbox), senw, FALSE, TRUE, 0);
311 gtk_widget_set_tooltip_text(senw, _("\tS\n" "W\t\tE\n" "\tN"));
312
313 /* S/W/N/E */
314 swne =
315 gtk_radio_button_new_with_label_from_widget(GTK_RADIO_BUTTON(nesw),
316 _("S/W/N/E"));
317 gtk_box_pack_start(GTK_BOX(hbox), swne, FALSE, TRUE, 0);
318 gtk_widget_set_tooltip_text(swne, _("\tS\n" "E\t\tW\n" "\tN"));
319
320 /* read orientation */
321 if (cfg != NULL)
322 {
323 orient = mod_cfg_get_int(cfg,
324 MOD_CFG_POLAR_SECTION,
325 MOD_CFG_POLAR_ORIENTATION,
326 SAT_CFG_INT_POLAR_ORIENTATION);
327 }
328 else
329 {
330 sat_cfg_get_int(SAT_CFG_INT_POLAR_ORIENTATION);
331 }
332
333 switch (orient)
334 {
335
336 case POLAR_VIEW_NESW:
337 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nesw), TRUE);
338 break;
339
340 case POLAR_VIEW_NWSE:
341 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nwse), TRUE);
342 break;
343
344 case POLAR_VIEW_SENW:
345 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(senw), TRUE);
346 break;
347
348 case POLAR_VIEW_SWNE:
349 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(swne), TRUE);
350 break;
351
352 default:
353 sat_log_log(SAT_LOG_LEVEL_ERROR,
354 _("%f:%d: Invalid PolarView orientation (%d)"),
355 __FILE__, __LINE__, orient);
356 orient = POLAR_VIEW_NESW;
357 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(nesw), TRUE);
358 break;
359 }
360
361 /* finally, connect the signals */
362 g_signal_connect(nesw, "toggled",
363 G_CALLBACK(orient_chganged),
364 GINT_TO_POINTER(POLAR_VIEW_NESW));
365 g_signal_connect(nwse, "toggled",
366 G_CALLBACK(orient_chganged),
367 GINT_TO_POINTER(POLAR_VIEW_NWSE));
368 g_signal_connect(senw, "toggled",
369 G_CALLBACK(orient_chganged),
370 GINT_TO_POINTER(POLAR_VIEW_SENW));
371 g_signal_connect(swne, "toggled",
372 G_CALLBACK(orient_chganged),
373 GINT_TO_POINTER(POLAR_VIEW_SWNE));
374 }
375
376 /**
377 * Create content selector widgets.
378 * @param cfg The module configuration or NULL in global mode.
379 * @param vbox The container box in which the widgets should be packed into.
380 *
381 * This function creates the widgets that are used to select what content, besides
382 * the satellites, should be drawn on the polar view. Choices are QTH info, next
383 * event, cursor coordinates, and extra tick marks.
384 */
create_bool_selectors(GKeyFile * cfg,GtkBox * vbox)385 static void create_bool_selectors(GKeyFile * cfg, GtkBox * vbox)
386 {
387 GtkWidget *label;
388 GtkWidget *hbox;
389
390 /* create header */
391 label = gtk_label_new(NULL);
392 g_object_set(label, "xalign", 0.0f, "yalign", 0.5f, NULL);
393 gtk_label_set_markup(GTK_LABEL(label), _("<b>Extra Contents:</b>"));
394 gtk_box_pack_start(vbox, label, FALSE, TRUE, 0);
395
396 /* horizontal box to contain the radio buttons */
397 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
398 gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE);
399 gtk_box_pack_start(vbox, hbox, FALSE, TRUE, 0);
400
401 /* QTH info */
402 qth = gtk_check_button_new_with_label(_("QTH Info"));
403 gtk_widget_set_tooltip_text(qth,
404 _
405 ("Show location information on the polar plot"));
406 if (cfg != NULL)
407 {
408 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(qth),
409 mod_cfg_get_bool(cfg,
410 MOD_CFG_POLAR_SECTION,
411 MOD_CFG_POLAR_SHOW_QTH_INFO,
412 SAT_CFG_BOOL_POL_SHOW_QTH_INFO));
413 }
414 else
415 {
416 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(qth),
417 sat_cfg_get_bool
418 (SAT_CFG_BOOL_POL_SHOW_QTH_INFO));
419 }
420 g_signal_connect(qth, "toggled", G_CALLBACK(content_changed), NULL);
421 gtk_box_pack_start(GTK_BOX(hbox), qth, FALSE, TRUE, 0);
422
423 /* Next Event */
424 next = gtk_check_button_new_with_label(_("Next Event"));
425 gtk_widget_set_tooltip_text(next,
426 _
427 ("Show which satellites comes up next and at what time"));
428 if (cfg != NULL)
429 {
430 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(next),
431 mod_cfg_get_bool(cfg,
432 MOD_CFG_POLAR_SECTION,
433 MOD_CFG_POLAR_SHOW_NEXT_EVENT,
434 SAT_CFG_BOOL_POL_SHOW_NEXT_EV));
435 }
436 else
437 {
438 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(next),
439 sat_cfg_get_bool
440 (SAT_CFG_BOOL_POL_SHOW_NEXT_EV));
441 }
442 g_signal_connect(next, "toggled", G_CALLBACK(content_changed), NULL);
443 gtk_box_pack_start(GTK_BOX(hbox), next, FALSE, TRUE, 0);
444
445 /* Cursor position */
446 curs = gtk_check_button_new_with_label(_("Cursor Position"));
447 gtk_widget_set_tooltip_text(curs,
448 _
449 ("Show the azimuth and elevation of the mouse pointer"));
450 if (cfg != NULL)
451 {
452 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(curs),
453 mod_cfg_get_bool(cfg,
454 MOD_CFG_POLAR_SECTION,
455 MOD_CFG_POLAR_SHOW_CURS_TRACK,
456 SAT_CFG_BOOL_POL_SHOW_CURS_TRACK));
457 }
458 else
459 {
460 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(curs),
461 sat_cfg_get_bool
462 (SAT_CFG_BOOL_POL_SHOW_CURS_TRACK));
463 }
464 g_signal_connect(curs, "toggled", G_CALLBACK(content_changed), NULL);
465 gtk_box_pack_start(GTK_BOX(hbox), curs, FALSE, TRUE, 0);
466
467 /* Extra tick marks */
468 xtick = gtk_check_button_new_with_label(_("Extra Az Ticks"));
469 gtk_widget_set_tooltip_text(xtick,
470 _
471 ("Show extra tick marks for every 30\302\260"));
472 if (cfg != NULL)
473 {
474 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xtick),
475 mod_cfg_get_bool(cfg,
476 MOD_CFG_POLAR_SECTION,
477 MOD_CFG_POLAR_SHOW_EXTRA_AZ_TICKS,
478 SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS));
479 }
480 else
481 {
482 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(xtick),
483 sat_cfg_get_bool
484 (SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS));
485 }
486 g_signal_connect(xtick, "toggled", G_CALLBACK(content_changed), NULL);
487 gtk_box_pack_start(GTK_BOX(hbox), xtick, FALSE, TRUE, 0);
488 }
489
490 /**
491 * Create color selector widgets.
492 *
493 * @param cfg The module configuration or NULL in global mode.
494 * @param vbox The container box in which the widgets should be packed into.
495 *
496 * This function creates the widgets for selecting colours for the plot background,
497 * axes, tick labels, satellites, track, and info text.
498 */
create_colour_selectors(GKeyFile * cfg,GtkBox * vbox)499 static void create_colour_selectors(GKeyFile * cfg, GtkBox * vbox)
500 {
501 GtkWidget *label;
502 GtkWidget *table;
503 guint cfg_rgba; /* 0xRRGGBBAA encoded color */
504 GdkRGBA gdk_rgba;
505
506 /* create header */
507 label = gtk_label_new(NULL);
508 g_object_set(label, "xalign", 0.0f, "yalign", 0.5f, NULL);
509 gtk_label_set_markup(GTK_LABEL(label), _("<b>Colours:</b>"));
510 gtk_box_pack_start(vbox, label, FALSE, TRUE, 0);
511
512 table = gtk_grid_new();
513 gtk_grid_set_column_homogeneous(GTK_GRID(table), FALSE);
514 gtk_grid_set_row_homogeneous(GTK_GRID(table), TRUE);
515 gtk_grid_set_column_spacing(GTK_GRID(table), 10);
516 gtk_grid_set_row_spacing(GTK_GRID(table), 3);
517 gtk_box_pack_start(vbox, table, FALSE, TRUE, 0);
518
519 /* background */
520 label = gtk_label_new(_("Background:"));
521 g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
522 gtk_grid_attach(GTK_GRID(table), label, 0, 0, 1, 1);
523 bgd = gtk_color_button_new();
524 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(bgd), TRUE);
525 gtk_grid_attach(GTK_GRID(table), bgd, 1, 0, 1, 1);
526 gtk_widget_set_tooltip_text(bgd, _("Click to select background colour"));
527 if (cfg != NULL)
528 {
529 cfg_rgba = mod_cfg_get_int(cfg,
530 MOD_CFG_POLAR_SECTION,
531 MOD_CFG_POLAR_BGD_COL,
532 SAT_CFG_INT_POLAR_BGD_COL);
533 }
534 else
535 {
536 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_BGD_COL);
537 }
538 rgba_from_cfg(cfg_rgba, &gdk_rgba);
539 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(bgd), &gdk_rgba);
540 g_signal_connect(bgd, "color-set", G_CALLBACK(colour_changed), NULL);
541
542 /* Axis */
543 label = gtk_label_new(_("Axes/Circles:"));
544 g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
545 gtk_grid_attach(GTK_GRID(table), label, 2, 0, 1, 1);
546 axis = gtk_color_button_new();
547 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(axis), TRUE);
548 gtk_grid_attach(GTK_GRID(table), axis, 3, 0, 1, 1);
549 gtk_widget_set_tooltip_text(axis, _("Click to select the axis colour"));
550 if (cfg != NULL)
551 {
552 cfg_rgba = mod_cfg_get_int(cfg,
553 MOD_CFG_POLAR_SECTION,
554 MOD_CFG_POLAR_AXIS_COL,
555 SAT_CFG_INT_POLAR_AXIS_COL);
556 }
557 else
558 {
559 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_AXIS_COL);
560 }
561 rgba_from_cfg(cfg_rgba, &gdk_rgba);
562 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(axis), &gdk_rgba);
563 g_signal_connect(axis, "color-set", G_CALLBACK(colour_changed), NULL);
564
565 /* tick labels */
566 label = gtk_label_new(_("Tick Labels:"));
567 g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
568 gtk_grid_attach(GTK_GRID(table), label, 4, 0, 1, 1);
569 tick = gtk_color_button_new();
570 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(tick), TRUE);
571 gtk_grid_attach(GTK_GRID(table), tick, 5, 0, 1, 1);
572 gtk_widget_set_tooltip_text(tick,
573 _
574 ("Click to select the colour for tick labels"));
575 if (cfg != NULL)
576 {
577 cfg_rgba = mod_cfg_get_int(cfg,
578 MOD_CFG_POLAR_SECTION,
579 MOD_CFG_POLAR_TICK_COL,
580 SAT_CFG_INT_POLAR_TICK_COL);
581 }
582 else
583 {
584 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_TICK_COL);
585 }
586 rgba_from_cfg(cfg_rgba, &gdk_rgba);
587 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(tick), &gdk_rgba);
588 g_signal_connect(tick, "color-set", G_CALLBACK(colour_changed), NULL);
589
590 /* satellite */
591 label = gtk_label_new(_("Satellite:"));
592 g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
593 gtk_grid_attach(GTK_GRID(table), label, 0, 1, 1, 1);
594 sat = gtk_color_button_new();
595 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(sat), TRUE);
596 gtk_grid_attach(GTK_GRID(table), sat, 1, 1, 1, 1);
597 gtk_widget_set_tooltip_text(sat, _("Click to select satellite colour"));
598 if (cfg != NULL)
599 {
600 cfg_rgba = mod_cfg_get_int(cfg,
601 MOD_CFG_POLAR_SECTION,
602 MOD_CFG_POLAR_SAT_COL,
603 SAT_CFG_INT_POLAR_SAT_COL);
604 }
605 else
606 {
607 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_SAT_COL);
608 }
609 rgba_from_cfg(cfg_rgba, &gdk_rgba);
610 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(sat), &gdk_rgba);
611 g_signal_connect(sat, "color-set", G_CALLBACK(colour_changed), NULL);
612
613 /* selected satellite */
614 label = gtk_label_new(_("Selected Sat.:"));
615 g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
616 gtk_grid_attach(GTK_GRID(table), label, 2, 1, 1, 1);
617 ssat = gtk_color_button_new();
618 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(ssat), TRUE);
619 gtk_grid_attach(GTK_GRID(table), ssat, 3, 1, 1, 1);
620 gtk_widget_set_tooltip_text(ssat,
621 _
622 ("Click to select colour for selected satellites"));
623 if (cfg != NULL)
624 {
625 cfg_rgba = mod_cfg_get_int(cfg,
626 MOD_CFG_POLAR_SECTION,
627 MOD_CFG_POLAR_SAT_SEL_COL,
628 SAT_CFG_INT_POLAR_SAT_SEL_COL);
629 }
630 else
631 {
632 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_SAT_SEL_COL);
633 }
634 rgba_from_cfg(cfg_rgba, &gdk_rgba);
635 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(ssat), &gdk_rgba);
636 g_signal_connect(ssat, "color-set", G_CALLBACK(colour_changed), NULL);
637
638 /* track */
639 label = gtk_label_new(_("Sky Track:"));
640 g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
641 gtk_grid_attach(GTK_GRID(table), label, 4, 1, 1, 1);
642 track = gtk_color_button_new();
643 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(track), TRUE);
644 gtk_grid_attach(GTK_GRID(table), track, 5, 1, 1, 1);
645 gtk_widget_set_tooltip_text(track, _("Click to select track colour"));
646 if (cfg != NULL)
647 {
648 cfg_rgba = mod_cfg_get_int(cfg,
649 MOD_CFG_POLAR_SECTION,
650 MOD_CFG_POLAR_TRACK_COL,
651 SAT_CFG_INT_POLAR_TRACK_COL);
652 }
653 else
654 {
655 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_TRACK_COL);
656 }
657 rgba_from_cfg(cfg_rgba, &gdk_rgba);
658 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(track), &gdk_rgba);
659 g_signal_connect(track, "color-set", G_CALLBACK(colour_changed), NULL);
660
661 /* Info */
662 label = gtk_label_new(_("Info Text:"));
663 g_object_set(label, "xalign", 1.0f, "yalign", 0.5f, NULL);
664 gtk_grid_attach(GTK_GRID(table), label, 0, 2, 1, 1);
665 info = gtk_color_button_new();
666 gtk_color_chooser_set_use_alpha(GTK_COLOR_CHOOSER(info), TRUE);
667 gtk_grid_attach(GTK_GRID(table), info, 1, 2, 1, 1);
668 gtk_widget_set_tooltip_text(info, _("Click to select background colour"));
669 if (cfg != NULL)
670 {
671 cfg_rgba = mod_cfg_get_int(cfg,
672 MOD_CFG_POLAR_SECTION,
673 MOD_CFG_POLAR_INFO_COL,
674 SAT_CFG_INT_POLAR_INFO_COL);
675 }
676 else
677 {
678 cfg_rgba = sat_cfg_get_int(SAT_CFG_INT_POLAR_INFO_COL);
679 }
680 rgba_from_cfg(cfg_rgba, &gdk_rgba);
681 gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(info), &gdk_rgba);
682 g_signal_connect(info, "color-set", G_CALLBACK(colour_changed), NULL);
683 }
684
685 /**
686 * Create miscellaneous config widgets.
687 * @param cfg The module configuration or NULL in global mode.
688 * @param vbox The container box in which the widgets should be packed into.
689 *
690 */
create_misc_selectors(GKeyFile * cfg,GtkBox * vbox)691 static void create_misc_selectors(GKeyFile * cfg, GtkBox * vbox)
692 {
693 GtkWidget *label;
694 GtkWidget *hbox;
695
696 /* create header */
697 label = gtk_label_new(NULL);
698 g_object_set(label, "xalign", 0.0f, "yalign", 0.5f, NULL);
699 gtk_label_set_markup(GTK_LABEL(label), _("<b>Miscellaneous:</b>"));
700 gtk_box_pack_start(vbox, label, FALSE, TRUE, 0);
701
702 /* horizontal box to contain the radio buttons */
703 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 10);
704 gtk_box_set_homogeneous(GTK_BOX(hbox), TRUE);
705 gtk_box_pack_start(vbox, hbox, FALSE, TRUE, 0);
706
707 /* show sky tracks */
708 showtrack = gtk_check_button_new_with_label(_("Show the sky tracks "
709 "automatically"));
710 gtk_widget_set_tooltip_text(showtrack,
711 _("Automatically show the sky track of a "
712 "satellite when it comes in range. You can always turn the "
713 "sky track OFF for each individual object"));
714 if (cfg != NULL)
715 {
716 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showtrack),
717 mod_cfg_get_bool(cfg,
718 MOD_CFG_POLAR_SECTION,
719 MOD_CFG_POLAR_SHOW_TRACK_AUTO,
720 SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO));
721 }
722 else
723 {
724 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(showtrack),
725 sat_cfg_get_bool
726 (SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO));
727 }
728 g_signal_connect(showtrack, "toggled", G_CALLBACK(content_changed), NULL);
729 gtk_box_pack_start(GTK_BOX(hbox), showtrack, FALSE, TRUE, 0);
730 }
731
732 /**
733 * Create RESET button.
734 * @param cfg Config data or NULL in global mode.
735 * @param vbox The container.
736 *
737 * This function creates and sets up the RESET button.
738 */
create_reset_button(GKeyFile * cfg,GtkBox * vbox)739 static void create_reset_button(GKeyFile * cfg, GtkBox * vbox)
740 {
741 GtkWidget *button;
742 GtkWidget *butbox;
743
744 button = gtk_button_new_with_label(_("Reset"));
745 g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(reset_cb), cfg);
746
747 if (cfg == NULL)
748 {
749 gtk_widget_set_tooltip_text(button,
750 _
751 ("Reset settings to the default values."));
752
753 }
754 else
755 {
756 gtk_widget_set_tooltip_text(button,
757 _
758 ("Reset module settings to the global values."));
759 }
760
761 butbox = gtk_button_box_new(GTK_ORIENTATION_HORIZONTAL);
762 gtk_button_box_set_layout(GTK_BUTTON_BOX(butbox), GTK_BUTTONBOX_END);
763 gtk_box_pack_end(GTK_BOX(butbox), button, FALSE, TRUE, 10);
764
765 gtk_box_pack_end(vbox, butbox, FALSE, TRUE, 0);
766 }
767
768 /* User pressed cancel. Any changes to config must be cancelled. */
sat_pref_polar_view_cancel(GKeyFile * cfg)769 void sat_pref_polar_view_cancel(GKeyFile * cfg)
770 {
771 (void)cfg;
772
773 dirty = FALSE;
774 }
775
776 /* User pressed OK. Any changes should be stored in config. */
sat_pref_polar_view_ok(GKeyFile * cfg)777 void sat_pref_polar_view_ok(GKeyFile * cfg)
778 {
779 GdkRGBA gdk_rgba;
780 guint rgba;
781
782 if (dirty)
783 {
784 if (cfg != NULL)
785 {
786 /* use g_key_file_set_xxx */
787
788 /* orientation */
789 g_key_file_set_integer(cfg,
790 MOD_CFG_POLAR_SECTION,
791 MOD_CFG_POLAR_ORIENTATION, orient);
792 /* extra contents */
793 g_key_file_set_boolean(cfg,
794 MOD_CFG_POLAR_SECTION,
795 MOD_CFG_POLAR_SHOW_QTH_INFO,
796 gtk_toggle_button_get_active
797 (GTK_TOGGLE_BUTTON(qth)));
798 g_key_file_set_boolean(cfg, MOD_CFG_POLAR_SECTION,
799 MOD_CFG_POLAR_SHOW_NEXT_EVENT,
800 gtk_toggle_button_get_active
801 (GTK_TOGGLE_BUTTON(next)));
802 g_key_file_set_boolean(cfg, MOD_CFG_POLAR_SECTION,
803 MOD_CFG_POLAR_SHOW_CURS_TRACK,
804 gtk_toggle_button_get_active
805 (GTK_TOGGLE_BUTTON(curs)));
806 g_key_file_set_boolean(cfg, MOD_CFG_POLAR_SECTION,
807 MOD_CFG_POLAR_SHOW_EXTRA_AZ_TICKS,
808 gtk_toggle_button_get_active
809 (GTK_TOGGLE_BUTTON(xtick)));
810
811 /* colours */
812 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(bgd), &gdk_rgba);
813 rgba = rgba_to_cfg(&gdk_rgba);
814 g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
815 MOD_CFG_POLAR_BGD_COL, rgba);
816
817 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(axis), &gdk_rgba);
818 rgba = rgba_to_cfg(&gdk_rgba);
819 g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
820 MOD_CFG_POLAR_AXIS_COL, rgba);
821
822 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(tick), &gdk_rgba);
823 rgba = rgba_to_cfg(&gdk_rgba);
824 g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
825 MOD_CFG_POLAR_TICK_COL, rgba);
826
827 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(sat), &gdk_rgba);
828 rgba = rgba_to_cfg(&gdk_rgba);
829 g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
830 MOD_CFG_POLAR_SAT_COL, rgba);
831
832 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(ssat), &gdk_rgba);
833 rgba = rgba_to_cfg(&gdk_rgba);
834 g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
835 MOD_CFG_POLAR_SAT_SEL_COL, rgba);
836
837 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(info), &gdk_rgba);
838 rgba = rgba_to_cfg(&gdk_rgba);
839 g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
840 MOD_CFG_POLAR_INFO_COL, rgba);
841
842 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(track), &gdk_rgba);
843 rgba = rgba_to_cfg(&gdk_rgba);
844 g_key_file_set_integer(cfg, MOD_CFG_POLAR_SECTION,
845 MOD_CFG_POLAR_TRACK_COL, rgba);
846
847 /* misc */
848 g_key_file_set_boolean(cfg,
849 MOD_CFG_POLAR_SECTION,
850 MOD_CFG_POLAR_SHOW_TRACK_AUTO,
851 gtk_toggle_button_get_active
852 (GTK_TOGGLE_BUTTON(showtrack)));
853
854 }
855 else
856 {
857 /* use sat_cfg_set_xxx */
858
859 /* orientation */
860 sat_cfg_set_int(SAT_CFG_INT_POLAR_ORIENTATION, orient);
861
862 /* extra contents */
863 sat_cfg_set_bool(SAT_CFG_BOOL_POL_SHOW_QTH_INFO,
864 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
865 (qth)));
866 sat_cfg_set_bool(SAT_CFG_BOOL_POL_SHOW_NEXT_EV,
867 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
868 (next)));
869 sat_cfg_set_bool(SAT_CFG_BOOL_POL_SHOW_CURS_TRACK,
870 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
871 (curs)));
872 sat_cfg_set_bool(SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS,
873 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
874 (xtick)));
875
876 /* colours */
877 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(bgd), &gdk_rgba);
878 rgba = rgba_to_cfg(&gdk_rgba);
879 sat_cfg_set_int(SAT_CFG_INT_POLAR_BGD_COL, rgba);
880
881 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(axis), &gdk_rgba);
882 rgba = rgba_to_cfg(&gdk_rgba);
883 sat_cfg_set_int(SAT_CFG_INT_POLAR_AXIS_COL, rgba);
884
885 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(tick), &gdk_rgba);
886 rgba = rgba_to_cfg(&gdk_rgba);
887 sat_cfg_set_int(SAT_CFG_INT_POLAR_TICK_COL, rgba);
888
889 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(sat), &gdk_rgba);
890 rgba = rgba_to_cfg(&gdk_rgba);
891 sat_cfg_set_int(SAT_CFG_INT_POLAR_SAT_COL, rgba);
892
893 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(ssat), &gdk_rgba);
894 rgba = rgba_to_cfg(&gdk_rgba);
895 sat_cfg_set_int(SAT_CFG_INT_POLAR_SAT_SEL_COL, rgba);
896
897 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(info), &gdk_rgba);
898 rgba = rgba_to_cfg(&gdk_rgba);
899 sat_cfg_set_int(SAT_CFG_INT_POLAR_INFO_COL, rgba);
900
901 gtk_color_chooser_get_rgba(GTK_COLOR_CHOOSER(track), &gdk_rgba);
902 rgba = rgba_to_cfg(&gdk_rgba);
903 sat_cfg_set_int(SAT_CFG_INT_POLAR_TRACK_COL, rgba);
904
905 /* misc */
906 sat_cfg_set_bool(SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO,
907 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON
908 (showtrack)));
909 }
910
911 dirty = FALSE;
912 }
913 else if (reset)
914 {
915 if (cfg != NULL)
916 {
917 /* use g_key_file_remove_key */
918 g_key_file_remove_key(cfg,
919 MOD_CFG_POLAR_SECTION,
920 MOD_CFG_POLAR_ORIENTATION, NULL);
921 g_key_file_remove_key(cfg,
922 MOD_CFG_POLAR_SECTION,
923 MOD_CFG_POLAR_SHOW_QTH_INFO, NULL);
924 g_key_file_remove_key(cfg,
925 MOD_CFG_POLAR_SECTION,
926 MOD_CFG_POLAR_SHOW_NEXT_EVENT, NULL);
927 g_key_file_remove_key(cfg,
928 MOD_CFG_POLAR_SECTION,
929 MOD_CFG_POLAR_SHOW_CURS_TRACK, NULL);
930 g_key_file_remove_key(cfg,
931 MOD_CFG_POLAR_SECTION,
932 MOD_CFG_POLAR_SHOW_EXTRA_AZ_TICKS, NULL);
933 g_key_file_remove_key(cfg,
934 MOD_CFG_POLAR_SECTION,
935 MOD_CFG_POLAR_BGD_COL, NULL);
936 g_key_file_remove_key(cfg,
937 MOD_CFG_POLAR_SECTION,
938 MOD_CFG_POLAR_AXIS_COL, NULL);
939 g_key_file_remove_key(cfg,
940 MOD_CFG_POLAR_SECTION,
941 MOD_CFG_POLAR_TICK_COL, NULL);
942 g_key_file_remove_key(cfg,
943 MOD_CFG_POLAR_SECTION,
944 MOD_CFG_POLAR_SAT_COL, NULL);
945 g_key_file_remove_key(cfg,
946 MOD_CFG_POLAR_SECTION,
947 MOD_CFG_POLAR_SAT_SEL_COL, NULL);
948 g_key_file_remove_key(cfg,
949 MOD_CFG_POLAR_SECTION,
950 MOD_CFG_POLAR_INFO_COL, NULL);
951 g_key_file_remove_key(cfg,
952 MOD_CFG_POLAR_SECTION,
953 MOD_CFG_POLAR_TRACK_COL, NULL);
954 g_key_file_remove_key(cfg,
955 MOD_CFG_POLAR_SECTION,
956 MOD_CFG_POLAR_SHOW_TRACK_AUTO, NULL);
957 }
958 else
959 {
960
961 /* use sat_cfg_reset_xxx */
962 /* orientation */
963 sat_cfg_reset_int(SAT_CFG_INT_POLAR_ORIENTATION);
964 /* extra contents */
965 sat_cfg_reset_bool(SAT_CFG_BOOL_POL_SHOW_QTH_INFO);
966 sat_cfg_reset_bool(SAT_CFG_BOOL_POL_SHOW_NEXT_EV);
967 sat_cfg_reset_bool(SAT_CFG_BOOL_POL_SHOW_CURS_TRACK);
968 sat_cfg_reset_bool(SAT_CFG_BOOL_POL_SHOW_EXTRA_AZ_TICKS);
969
970 /* colours */
971 sat_cfg_reset_int(SAT_CFG_INT_POLAR_BGD_COL);
972 sat_cfg_reset_int(SAT_CFG_INT_POLAR_AXIS_COL);
973 sat_cfg_reset_int(SAT_CFG_INT_POLAR_TICK_COL);
974 sat_cfg_reset_int(SAT_CFG_INT_POLAR_SAT_COL);
975 sat_cfg_reset_int(SAT_CFG_INT_POLAR_SAT_SEL_COL);
976 sat_cfg_reset_int(SAT_CFG_INT_POLAR_INFO_COL);
977 sat_cfg_reset_int(SAT_CFG_INT_POLAR_TRACK_COL);
978
979 /* misc */
980 sat_cfg_reset_bool(SAT_CFG_BOOL_POL_SHOW_TRACK_AUTO);
981 }
982 reset = FALSE;
983 }
984 }
985
986 /*
987 * Create and initialise widgets for the polar view preferences tab.
988 *
989 * The widgets must be preloaded with values from config. If a config value
990 * is NULL, sensible default values, eg. those from defaults.h should
991 * be laoded.
992 */
sat_pref_polar_view_create(GKeyFile * cfg)993 GtkWidget *sat_pref_polar_view_create(GKeyFile * cfg)
994 {
995 GtkWidget *vbox;
996
997 /* create vertical box */
998 vbox = gtk_box_new(GTK_ORIENTATION_VERTICAL, 5);
999 gtk_box_set_homogeneous(GTK_BOX(vbox), FALSE);
1000 gtk_container_set_border_width(GTK_CONTAINER(vbox), 20);
1001
1002 /* create the components */
1003 create_orient_selector(cfg, GTK_BOX(vbox));
1004 gtk_box_pack_start(GTK_BOX(vbox),
1005 gtk_separator_new(GTK_ORIENTATION_HORIZONTAL),
1006 FALSE, TRUE, 10);
1007 create_bool_selectors(cfg, GTK_BOX(vbox));
1008 gtk_box_pack_start(GTK_BOX(vbox),
1009 gtk_separator_new(GTK_ORIENTATION_HORIZONTAL),
1010 FALSE, TRUE, 10);
1011 create_colour_selectors(cfg, GTK_BOX(vbox));
1012 gtk_box_pack_start(GTK_BOX(vbox),
1013 gtk_separator_new(GTK_ORIENTATION_HORIZONTAL),
1014 FALSE, TRUE, 10);
1015 create_misc_selectors(cfg, GTK_BOX(vbox));
1016 gtk_box_pack_start(GTK_BOX(vbox),
1017 gtk_separator_new(GTK_ORIENTATION_HORIZONTAL),
1018 FALSE, TRUE, 10);
1019 create_reset_button(cfg, GTK_BOX(vbox));
1020
1021 reset = FALSE;
1022 dirty = FALSE;
1023
1024 return vbox;
1025 }
1026