1 /*
2 * Celestia GTK+ Front-End
3 * Copyright (C) 2005 Pat Suwalski <pat@suwalski.net>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * $Id: settings-gconf.cpp,v 1.4 2008-01-18 04:36:11 suwalski Exp $
11 */
12
13 #include <gtk/gtk.h>
14 #include <gconf/gconf-client.h>
15
16 #include <celengine/body.h>
17 #include <celengine/galaxy.h>
18 #include <celengine/render.h>
19
20 #include "settings-gconf.h"
21 #include "common.h"
22
23
24 /* Definitions: GConf Callbacks */
25 static void confLabels(GConfClient*, guint, GConfEntry*, AppData* app);
26 static void confRender(GConfClient*, guint, GConfEntry*, AppData* app);
27 static void confOrbits(GConfClient*, guint, GConfEntry*, AppData* app);
28 static void confWinWidth(GConfClient*, guint, GConfEntry* e, AppData* app);
29 static void confWinHeight(GConfClient*, guint, GConfEntry* e, AppData* app);
30 static void confWinX(GConfClient*, guint, GConfEntry* e, AppData* app);
31 static void confWinY(GConfClient*, guint, GConfEntry* e, AppData* app);
32 static void confAmbientLight(GConfClient*, guint, GConfEntry* e, AppData* app);
33 static void confVisualMagnitude(GConfClient*, guint, GConfEntry* e, AppData* app);
34 static void confGalaxyLightGain(GConfClient*, guint, GConfEntry* e, AppData*);
35 static void confDistanceLimit(GConfClient*, guint, GConfEntry* e, AppData*);
36 static void confShowLocalTime(GConfClient*, guint, GConfEntry* e, AppData* app);
37 static void confVerbosity(GConfClient*, guint, GConfEntry* e, AppData* app);
38 static void confFullScreen(GConfClient*, guint, GConfEntry* e, AppData* app);
39 static void confStarStyle(GConfClient*, guint, GConfEntry* e, AppData* app);
40 static void confTextureResolution(GConfClient*, guint, GConfEntry* e, AppData* app);
41 static void confAltSurfaceName(GConfClient*, guint, GConfEntry* e, AppData* app);
42 static void confVideoSync(GConfClient*, guint, GConfEntry* e, AppData* app);
43
44 /* Definitions: Helpers */
45 static int readGConfRender(GConfClient* client);
46 static int readGConfOrbits(GConfClient* client);
47 static int readGConfLabels(GConfClient* client);
48 static void gcSetFlag(int type, const char* name, gboolean value, GConfClient* client);
49
50
51 /* ENTRY: Initializes the GConf connection */
initSettingsGConf(AppData * app)52 void initSettingsGConf(AppData* app)
53 {
54 app->client = gconf_client_get_default();
55 gconf_client_add_dir(app->client, "/apps/celestia", GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);
56 }
57
58
59 /* ENTRY: Connects GConf keys to their callbacks */
initSettingsGConfNotifiers(AppData * app)60 void initSettingsGConfNotifiers(AppData* app)
61 {
62 /* Add preference client notifiers. */
63 gconf_client_notify_add (app->client, "/apps/celestia/labels", (GConfClientNotifyFunc)confLabels, app, NULL, NULL);
64 gconf_client_notify_add (app->client, "/apps/celestia/render", (GConfClientNotifyFunc)confRender, app, NULL, NULL);
65 gconf_client_notify_add (app->client, "/apps/celestia/orbits", (GConfClientNotifyFunc)confOrbits, app, NULL, NULL);
66 gconf_client_notify_add (app->client, "/apps/celestia/winWidth", (GConfClientNotifyFunc)confWinWidth, app, NULL, NULL);
67 gconf_client_notify_add (app->client, "/apps/celestia/winHeight", (GConfClientNotifyFunc)confWinHeight, app, NULL, NULL);
68 gconf_client_notify_add (app->client, "/apps/celestia/winX", (GConfClientNotifyFunc)confWinX, app, NULL, NULL);
69 gconf_client_notify_add (app->client, "/apps/celestia/winY", (GConfClientNotifyFunc)confWinY, app, NULL, NULL);
70 gconf_client_notify_add (app->client, "/apps/celestia/ambientLight", (GConfClientNotifyFunc)confAmbientLight, app, NULL, NULL);
71 gconf_client_notify_add (app->client, "/apps/celestia/visualMagnitude", (GConfClientNotifyFunc)confVisualMagnitude, app, NULL, NULL);
72 gconf_client_notify_add (app->client, "/apps/celestia/galaxyLightGain", (GConfClientNotifyFunc)confGalaxyLightGain, app, NULL, NULL);
73 gconf_client_notify_add (app->client, "/apps/celestia/distanceLimit", (GConfClientNotifyFunc)confDistanceLimit, app, NULL, NULL);
74 gconf_client_notify_add (app->client, "/apps/celestia/showLocalTime", (GConfClientNotifyFunc)confShowLocalTime, app, NULL, NULL);
75 gconf_client_notify_add (app->client, "/apps/celestia/verbosity", (GConfClientNotifyFunc)confVerbosity, app, NULL, NULL);
76 gconf_client_notify_add (app->client, "/apps/celestia/fullScreen", (GConfClientNotifyFunc)confFullScreen, app, NULL, NULL);
77 gconf_client_notify_add (app->client, "/apps/celestia/starStyle", (GConfClientNotifyFunc)confStarStyle, app, NULL, NULL);
78 gconf_client_notify_add (app->client, "/apps/celestia/textureResolution", (GConfClientNotifyFunc)confTextureResolution, app, NULL, NULL);
79 gconf_client_notify_add (app->client, "/apps/celestia/altSurfaceName", (GConfClientNotifyFunc)confAltSurfaceName, app, NULL, NULL);
80 gconf_client_notify_add (app->client, "/apps/celestia/videoSync", (GConfClientNotifyFunc)confVideoSync, app, NULL, NULL);
81 }
82
83
84 /* ENTRY: Reads preferences required before initializing simulation */
applySettingsGConfPre(AppData * app,GConfClient * client)85 void applySettingsGConfPre(AppData* app, GConfClient* client)
86 {
87 int sizeX, sizeY, positionX, positionY;
88
89 /* Error checking occurs as values are used */
90 sizeX = gconf_client_get_int(client, "/apps/celestia/winWidth", NULL);
91 sizeY = gconf_client_get_int(client, "/apps/celestia/winHeight", NULL);
92 positionX = gconf_client_get_int(client, "/apps/celestia/winX", NULL);
93 positionY = gconf_client_get_int(client, "/apps/celestia/winY", NULL);
94 app->fullScreen = gconf_client_get_bool(client, "/apps/celestia/fullScreen", NULL);
95
96 setSaneWinSize(app, sizeX, sizeY);
97 setSaneWinPosition(app, positionX, positionY);
98 }
99
100
101 /* ENTRY: Reads and applies basic preferences */
applySettingsGConfMain(AppData * app,GConfClient * client)102 void applySettingsGConfMain(AppData* app, GConfClient* client)
103 {
104 int rf, om, lm;
105
106 /* All settings that need sanity checks get them */
107 setSaneAmbientLight(app, gconf_client_get_float(client, "/apps/celestia/ambientLight", NULL));
108 setSaneVisualMagnitude(app, gconf_client_get_float(client, "/apps/celestia/visualMagnitude", NULL));
109 setSaneGalaxyLightGain(gconf_client_get_float(client, "/apps/celestia/galaxyLightGain", NULL));
110 setSaneDistanceLimit(app, gconf_client_get_int(client, "/apps/celestia/distanceLimit", NULL));
111 setSaneVerbosity(app, gconf_client_get_int(client, "/apps/celestia/verbosity", NULL));
112 setSaneStarStyle(app, (Renderer::StarStyle)gconf_client_get_int(client, "/apps/celestia/starStyle", NULL));
113 setSaneTextureResolution(app, gconf_client_get_int(client, "/apps/celestia/textureResolution", NULL));
114 setSaneAltSurface(app, gconf_client_get_string(client, "/apps/celestia/altSurfaceName", NULL));
115
116 app->showLocalTime = gconf_client_get_bool(client, "/apps/celestia/showLocalTime", NULL);
117
118 app->renderer->setVideoSync(gconf_client_get_bool(client, "/apps/celestia/videoSync", NULL));
119
120 /* Render Flags */
121 rf = readGConfRender(app->client);
122 app->renderer->setRenderFlags(rf);
123
124 /* Orbit Mode */
125 om = readGConfOrbits(app->client);
126 app->renderer->setOrbitMask(om);
127
128 /* Label Mode */
129 lm = readGConfLabels(app->client);
130 app->renderer->setLabelMode(lm);
131 }
132
133
134 /* ENTRY: Saves the final settings that are not updated on-the-fly */
saveSettingsGConf(AppData * app)135 void saveSettingsGConf(AppData* app)
136 {
137 /* Save window position */
138 gconf_client_set_int(app->client, "/apps/celestia/winX", getWinX(app), NULL);
139 gconf_client_set_int(app->client, "/apps/celestia/winY", getWinY(app), NULL);
140
141 /* Save window size */
142 gconf_client_set_int(app->client, "/apps/celestia/winWidth", getWinWidth(app), NULL);
143 gconf_client_set_int(app->client, "/apps/celestia/winHeight", getWinHeight(app), NULL);
144
145 /* These do not produce notification when changed */
146 gconf_client_set_int(app->client, "/apps/celestia/textureResolution", app->renderer->getResolution(), NULL);
147 gconf_client_set_int(app->client, "/apps/celestia/distanceLimit", (int)app->renderer->getDistanceLimit(), NULL);
148
149 g_object_unref (G_OBJECT (app->client));
150 }
151
152
153 /* UTILITY: Converts a binary render flag to individual keys */
gcSetRenderFlag(int flag,gboolean state,GConfClient * client)154 void gcSetRenderFlag(int flag, gboolean state, GConfClient* client)
155 {
156 switch (flag)
157 {
158 case Renderer::ShowStars: gcSetFlag(Render, "stars", state, client); break;
159 case Renderer::ShowPlanets: gcSetFlag(Render, "planets", state, client); break;
160 case Renderer::ShowGalaxies: gcSetFlag(Render, "galaxies", state, client); break;
161 case Renderer::ShowDiagrams: gcSetFlag(Render, "diagrams", state, client); break;
162 case Renderer::ShowCloudMaps: gcSetFlag(Render, "cloudMaps", state, client); break;
163 case Renderer::ShowOrbits: gcSetFlag(Render, "orbits", state, client); break;
164 case Renderer::ShowCelestialSphere: gcSetFlag(Render, "celestialSphere", state, client); break;
165 case Renderer::ShowNightMaps: gcSetFlag(Render, "nightMaps", state, client); break;
166 case Renderer::ShowAtmospheres: gcSetFlag(Render, "atmospheres", state, client); break;
167 case Renderer::ShowSmoothLines: gcSetFlag(Render, "smoothLines", state, client); break;
168 case Renderer::ShowEclipseShadows: gcSetFlag(Render, "eclipseShadows", state, client); break;
169 case Renderer::ShowRingShadows: gcSetFlag(Render, "ringShadows", state, client); break;
170 case Renderer::ShowBoundaries: gcSetFlag(Render, "boundaries", state, client); break;
171 case Renderer::ShowAutoMag: gcSetFlag(Render, "autoMag", state, client); break;
172 case Renderer::ShowCometTails: gcSetFlag(Render, "cometTails", state, client); break;
173 case Renderer::ShowMarkers: gcSetFlag(Render, "markers", state, client); break;
174 case Renderer::ShowPartialTrajectories: gcSetFlag(Render, "partialTrajectories", state, client); break;
175 case Renderer::ShowNebulae: gcSetFlag(Render, "nebulae", state, client); break;
176 case Renderer::ShowOpenClusters: gcSetFlag(Render, "openClusters", state, client); break;
177 case Renderer::ShowGlobulars: gcSetFlag(Render, "globulars", state, client); break;
178 case Renderer::ShowGalacticGrid: gcSetFlag(Render, "gridGalactic", state, client); break;
179 case Renderer::ShowEclipticGrid: gcSetFlag(Render, "gridEcliptic", state, client); break;
180 case Renderer::ShowHorizonGrid: gcSetFlag(Render, "gridHorizontal", state, client); break;
181 }
182 }
183
184
185 /* UTILITY: Converts a binary orbit mask to individual keys */
gcSetOrbitMask(int flag,gboolean state,GConfClient * client)186 void gcSetOrbitMask(int flag, gboolean state, GConfClient* client)
187 {
188 switch (flag)
189 {
190 case Body::Planet: gcSetFlag(Orbit, "planet", state, client); break;
191 case Body::Moon: gcSetFlag(Orbit, "moon", state, client); break;
192 case Body::Asteroid: gcSetFlag(Orbit, "asteroid", state, client); break;
193 case Body::Spacecraft: gcSetFlag(Orbit, "spacecraft", state, client); break;
194 case Body::Comet: gcSetFlag(Orbit, "comet", state, client); break;
195 case Body::Invisible: gcSetFlag(Orbit, "invisible", state, client); break;
196 case Body::Unknown: gcSetFlag(Orbit, "unknown", state, client); break;
197 }
198 }
199
200
201 /* UTILITY: Converts a binary label mode to individual keys */
gcSetLabelMode(int flag,gboolean state,GConfClient * client)202 void gcSetLabelMode(int flag, gboolean state, GConfClient* client)
203 {
204 switch (flag)
205 {
206 case Renderer::StarLabels: gcSetFlag(Label, "star", state, client); break;
207 case Renderer::PlanetLabels: gcSetFlag(Label, "planet", state, client); break;
208 case Renderer::MoonLabels: gcSetFlag(Label, "moon", state, client); break;
209 case Renderer::ConstellationLabels: gcSetFlag(Label, "constellation", state, client); break;
210 case Renderer::GalaxyLabels: gcSetFlag(Label, "galaxy", state, client); break;
211 case Renderer::AsteroidLabels: gcSetFlag(Label, "asteroid", state, client); break;
212 case Renderer::SpacecraftLabels: gcSetFlag(Label, "spacecraft", state, client); break;
213 case Renderer::LocationLabels: gcSetFlag(Label, "location", state, client); break;
214 case Renderer::CometLabels: gcSetFlag(Label, "comet", state, client); break;
215 case Renderer::NebulaLabels: gcSetFlag(Label, "nebula", state, client); break;
216 case Renderer::OpenClusterLabels: gcSetFlag(Label, "openCluster", state, client); break;
217 case Renderer::I18nConstellationLabels: gcSetFlag(Label, "i18n", state, client); break;
218 case Renderer::GlobularLabels: gcSetFlag(Label, "globular", state, client); break;
219 }
220 }
221
222
223 /* GCONF CALLBACK: Reloads labels upon change */
confLabels(GConfClient *,guint,GConfEntry *,AppData * app)224 static void confLabels(GConfClient*, guint, GConfEntry*, AppData* app)
225 {
226 int oldLabels = app->renderer->getLabelMode();
227
228 /* Reload all the labels */
229 int newLabels = readGConfLabels(app->client);
230
231 /* Set label flags */
232 if (newLabels != oldLabels)
233 app->renderer->setLabelMode(newLabels);
234 }
235
236
237 /* GCONF CALLBACK: Reloads render flags upon change */
confRender(GConfClient *,guint,GConfEntry *,AppData * app)238 static void confRender(GConfClient*, guint, GConfEntry*, AppData* app)
239 {
240 int oldRender = app->renderer->getRenderFlags();
241
242 /* Reload all the render flags */
243 int newRender = readGConfRender(app->client);
244
245 /* Set render flags */
246 if (newRender != oldRender)
247 app->renderer->setRenderFlags(newRender);
248 }
249
250
251 /* GCONF CALLBACK: Reloads orbits upon change */
confOrbits(GConfClient *,guint,GConfEntry *,AppData * app)252 static void confOrbits(GConfClient*, guint, GConfEntry*, AppData* app)
253 {
254 int oldOrbit = app->renderer->getOrbitMask();
255
256 /* Reload all the orbits */
257 int newOrbit = readGConfOrbits(app->client);
258
259 /* Set orbit flags */
260 if (newOrbit != oldOrbit)
261 app->renderer->setOrbitMask(newOrbit);
262 }
263
264
265 /* GCONF CALLBACK: Sets window width upon change */
confWinWidth(GConfClient *,guint,GConfEntry * e,AppData * app)266 static void confWinWidth(GConfClient*, guint, GConfEntry* e, AppData* app)
267 {
268 int w = gconf_value_get_int(e->value);
269
270 if (w != getWinWidth(app))
271 setSaneWinSize(app, w, getWinHeight(app));
272 }
273
274
275 /* GCONF CALLBACK: Sets window height upon change */
confWinHeight(GConfClient *,guint,GConfEntry * e,AppData * app)276 static void confWinHeight(GConfClient*, guint, GConfEntry* e, AppData* app)
277 {
278 int h = gconf_value_get_int(e->value);
279
280 if (h != getWinHeight(app))
281 setSaneWinSize(app, getWinWidth(app), h);
282 }
283
284
285 /* GCONF CALLBACK: Sets window X position upon change */
confWinX(GConfClient *,guint,GConfEntry * e,AppData * app)286 static void confWinX(GConfClient*, guint, GConfEntry* e, AppData* app)
287 {
288 int x = gconf_value_get_int(e->value);
289
290 if (x != getWinX(app))
291 setSaneWinPosition(app, x, getWinY(app));
292 }
293
294
295 /* GCONF CALLBACK: Sets window Y position upon change */
confWinY(GConfClient *,guint,GConfEntry * e,AppData * app)296 static void confWinY(GConfClient*, guint, GConfEntry* e, AppData* app)
297 {
298 int y = gconf_value_get_int(e->value);
299
300 if (y != getWinY(app))
301 setSaneWinPosition(app, getWinX(app), y);
302 }
303
304
305 /* GCONF CALLBACK: Reloads ambient light setting upon change */
confAmbientLight(GConfClient *,guint,GConfEntry * e,AppData * app)306 static void confAmbientLight(GConfClient*, guint, GConfEntry* e, AppData* app)
307 {
308 float value = gconf_value_get_float(e->value);
309
310 /* Comparing floats is tricky. Three decimal places is "close enough." */
311 if (abs(value - app->renderer->getAmbientLightLevel()) < 0.001)
312 return;
313
314 setSaneAmbientLight(app, value);
315 }
316
317
318 /* GCONF CALLBACK: Reloads visual magnitude setting upon change */
confVisualMagnitude(GConfClient *,guint,GConfEntry * e,AppData * app)319 static void confVisualMagnitude(GConfClient*, guint, GConfEntry* e, AppData* app)
320 {
321 float value = gconf_value_get_float(e->value);
322
323 if (abs(value - app->simulation->getFaintestVisible()) < 0.001)
324 return;
325
326 setSaneVisualMagnitude(app, value);
327 }
328
329
330 /* GCONF CALLBACK: Reloads galaxy light gain setting upon change */
confGalaxyLightGain(GConfClient *,guint,GConfEntry * e,AppData *)331 static void confGalaxyLightGain(GConfClient*, guint, GConfEntry* e, AppData*)
332 {
333 float value = gconf_value_get_float(e->value);
334
335 if (abs(value - Galaxy::getLightGain()) < 0.001)
336 return;
337
338 setSaneGalaxyLightGain(value);
339 }
340
341
342 /* GCONF CALLBACK: Sets texture resolution when changed */
confDistanceLimit(GConfClient *,guint,GConfEntry * e,AppData * app)343 static void confDistanceLimit(GConfClient*, guint, GConfEntry* e, AppData* app)
344 {
345 int value = gconf_value_get_int(e->value);
346
347 if (value == app->renderer->getDistanceLimit())
348 return;
349
350 setSaneDistanceLimit(app, value);
351 }
352
353
354 /* GCONF CALLBACK: Sets "show local time" setting upon change */
confShowLocalTime(GConfClient *,guint,GConfEntry * e,AppData * app)355 static void confShowLocalTime(GConfClient*, guint, GConfEntry* e, AppData* app)
356 {
357 gboolean value = gconf_value_get_bool(e->value);
358
359 if (value == app->showLocalTime)
360 return;
361
362 app->showLocalTime = value;
363 updateTimeZone(app, app->showLocalTime);
364 }
365
366
367 /* GCONF CALLBACK: Sets HUD detail when changed */
confVerbosity(GConfClient *,guint,GConfEntry * e,AppData * app)368 static void confVerbosity(GConfClient*, guint, GConfEntry* e, AppData* app)
369 {
370 int value = gconf_value_get_int(e->value);
371
372 if (value == app->core->getHudDetail())
373 return;
374
375 setSaneVerbosity(app, value);
376 }
377
378
379 /* GCONF CALLBACK: Sets window to fullscreen when change occurs */
confFullScreen(GConfClient *,guint,GConfEntry * e,AppData * app)380 static void confFullScreen(GConfClient*, guint, GConfEntry* e, AppData* app)
381 {
382 gboolean value = gconf_value_get_bool(e->value);
383
384 /* There is no way to determine if the window is actually full screen */
385 if (value == app->fullScreen)
386 return;
387
388 /* The Action handler for full-screen toggles for us, so we set it opposite
389 * of what is wanted, and... */
390 app->fullScreen = !value;
391
392 /* ... tickle it. */
393 gtk_toggle_action_set_active(GTK_TOGGLE_ACTION(gtk_action_group_get_action(app->agMain, "FullScreen")), value);
394 }
395
396
397 /* GCONF CALLBACK: Sets star style when changed */
confStarStyle(GConfClient *,guint,GConfEntry * e,AppData * app)398 static void confStarStyle(GConfClient*, guint, GConfEntry* e, AppData* app)
399 {
400 int value = gconf_value_get_int(e->value);
401
402 if (value == app->renderer->getStarStyle())
403 return;
404
405 setSaneStarStyle(app, (Renderer::StarStyle)value);
406 }
407
408
409 /* GCONF CALLBACK: Sets texture resolution when changed */
confTextureResolution(GConfClient *,guint,GConfEntry * e,AppData * app)410 static void confTextureResolution(GConfClient*, guint, GConfEntry* e, AppData* app)
411 {
412 int value = gconf_value_get_int(e->value);
413
414 if (value == (int)app->renderer->getResolution())
415 return;
416
417 setSaneTextureResolution(app, value);
418 }
419
420
421 /* GCONF CALLBACK: Sets alternate surface texture when changed */
confAltSurfaceName(GConfClient *,guint,GConfEntry * e,AppData * app)422 static void confAltSurfaceName(GConfClient*, guint, GConfEntry* e, AppData* app)
423 {
424 const char* value = gconf_value_get_string(e->value);
425
426 if (string(value) == app->simulation->getActiveObserver()->getDisplayedSurface())
427 return;
428
429 setSaneAltSurface(app, (char*)value);
430 }
431
432
433 /* GCONF CALLBACK: Sets video framerate sync when changed */
confVideoSync(GConfClient *,guint,GConfEntry * e,AppData * app)434 static void confVideoSync(GConfClient*, guint, GConfEntry* e, AppData* app)
435 {
436 gboolean value = gconf_value_get_bool(e->value);
437
438 if (value == app->renderer->getVideoSync())
439 return;
440
441 app->renderer->setVideoSync(value);
442 }
443
444
445 /* HELPER: Reads in GConf->Render preferences and returns as int mask */
readGConfRender(GConfClient * client)446 static int readGConfRender(GConfClient* client)
447 {
448 int rf = Renderer::ShowNothing;
449 rf |= Renderer::ShowStars * gconf_client_get_bool(client, "/apps/celestia/render/stars", NULL);
450 rf |= Renderer::ShowPlanets * gconf_client_get_bool(client, "/apps/celestia/render/planets", NULL);
451 rf |= Renderer::ShowGalaxies * gconf_client_get_bool(client, "/apps/celestia/render/galaxies", NULL);
452 rf |= Renderer::ShowDiagrams * gconf_client_get_bool(client, "/apps/celestia/render/diagrams", NULL);
453 rf |= Renderer::ShowCloudMaps * gconf_client_get_bool(client, "/apps/celestia/render/cloudMaps", NULL);
454 rf |= Renderer::ShowOrbits * gconf_client_get_bool(client, "/apps/celestia/render/orbits", NULL);
455 rf |= Renderer::ShowCelestialSphere * gconf_client_get_bool(client, "/apps/celestia/render/celestialSphere", NULL);
456 rf |= Renderer::ShowNightMaps * gconf_client_get_bool(client, "/apps/celestia/render/nightMaps", NULL);
457 rf |= Renderer::ShowAtmospheres * gconf_client_get_bool(client, "/apps/celestia/render/atmospheres", NULL);
458 rf |= Renderer::ShowSmoothLines * gconf_client_get_bool(client, "/apps/celestia/render/smoothLines", NULL);
459 rf |= Renderer::ShowEclipseShadows * gconf_client_get_bool(client, "/apps/celestia/render/eclipseShadows", NULL);
460 rf |= Renderer::ShowRingShadows * gconf_client_get_bool(client, "/apps/celestia/render/ringShadows", NULL);
461 rf |= Renderer::ShowBoundaries * gconf_client_get_bool(client, "/apps/celestia/render/boundaries", NULL);
462 rf |= Renderer::ShowAutoMag * gconf_client_get_bool(client, "/apps/celestia/render/autoMag", NULL);
463 rf |= Renderer::ShowCometTails * gconf_client_get_bool(client, "/apps/celestia/render/cometTails", NULL);
464 rf |= Renderer::ShowMarkers * gconf_client_get_bool(client, "/apps/celestia/render/markers", NULL);
465 rf |= Renderer::ShowPartialTrajectories * gconf_client_get_bool(client, "/apps/celestia/render/partialTrajectories", NULL);
466 rf |= Renderer::ShowNebulae * gconf_client_get_bool(client, "/apps/celestia/render/nebulae", NULL);
467 rf |= Renderer::ShowOpenClusters * gconf_client_get_bool(client, "/apps/celestia/render/openClusters", NULL);
468 rf |= Renderer::ShowGlobulars * gconf_client_get_bool(client, "/apps/celestia/render/globulars", NULL);
469 rf |= Renderer::ShowGalacticGrid * gconf_client_get_bool(client, "/apps/celestia/render/gridGalactic", NULL);
470 rf |= Renderer::ShowEclipticGrid * gconf_client_get_bool(client, "/apps/celestia/render/gridEcliptic", NULL);
471 rf |= Renderer::ShowHorizonGrid * gconf_client_get_bool(client, "/apps/celestia/render/gridHorizontal", NULL);
472
473 return rf;
474 }
475
476
477 /* HELPER: Reads in GConf->Orbits preferences and returns as int mask */
readGConfOrbits(GConfClient * client)478 static int readGConfOrbits(GConfClient* client)
479 {
480 int om = 0;
481 om |= Body::Planet * gconf_client_get_bool(client, "/apps/celestia/orbits/planet", NULL);
482 om |= Body::Moon * gconf_client_get_bool(client, "/apps/celestia/orbits/moon", NULL);
483 om |= Body::Asteroid * gconf_client_get_bool(client, "/apps/celestia/orbits/asteroid", NULL);
484 om |= Body::Comet * gconf_client_get_bool(client, "/apps/celestia/orbits/comet", NULL);
485 om |= Body::Spacecraft * gconf_client_get_bool(client, "/apps/celestia/orbits/spacecraft", NULL);
486 om |= Body::Invisible * gconf_client_get_bool(client, "/apps/celestia/orbits/invisible", NULL);
487 om |= Body::Unknown * gconf_client_get_bool(client, "/apps/celestia/orbits/unknown", NULL);
488
489 return om;
490 }
491
492
493 /* HELPER: Reads in GConf->Labels preferences and returns as int mask */
readGConfLabels(GConfClient * client)494 static int readGConfLabels(GConfClient* client)
495 {
496 int lm = Renderer::NoLabels;
497 lm |= Renderer::StarLabels * gconf_client_get_bool(client, "/apps/celestia/labels/star", NULL);
498 lm |= Renderer::PlanetLabels * gconf_client_get_bool(client, "/apps/celestia/labels/planet", NULL);
499 lm |= Renderer::MoonLabels * gconf_client_get_bool(client, "/apps/celestia/labels/moon", NULL);
500 lm |= Renderer::ConstellationLabels * gconf_client_get_bool(client, "/apps/celestia/labels/constellation", NULL);
501 lm |= Renderer::GalaxyLabels * gconf_client_get_bool(client, "/apps/celestia/labels/galaxy", NULL);
502 lm |= Renderer::AsteroidLabels * gconf_client_get_bool(client, "/apps/celestia/labels/asteroid", NULL);
503 lm |= Renderer::SpacecraftLabels * gconf_client_get_bool(client, "/apps/celestia/labels/spacecraft", NULL);
504 lm |= Renderer::LocationLabels * gconf_client_get_bool(client, "/apps/celestia/labels/location", NULL);
505 lm |= Renderer::CometLabels * gconf_client_get_bool(client, "/apps/celestia/labels/comet", NULL);
506 lm |= Renderer::NebulaLabels * gconf_client_get_bool(client, "/apps/celestia/labels/nebula", NULL);
507 lm |= Renderer::OpenClusterLabels * gconf_client_get_bool(client, "/apps/celestia/labels/openCluster", NULL);
508 lm |= Renderer::I18nConstellationLabels * gconf_client_get_bool(client, "/apps/celestia/labels/i18n", NULL);
509 lm |= Renderer::GlobularLabels * gconf_client_get_bool(client, "/apps/celestia/labels/globular", NULL);
510
511 return lm;
512 }
513
514
515 /* HELPER: Sets one of the flags according to provided type, key, and value */
gcSetFlag(int type,const char * name,gboolean value,GConfClient * client)516 static void gcSetFlag(int type, const char* name, gboolean value, GConfClient* client)
517 {
518 gchar key[60];
519 switch (type)
520 {
521 case Render: sprintf(key, "%s%s", "/apps/celestia/render/", name); break;
522 case Orbit: sprintf(key, "%s%s", "/apps/celestia/orbits/", name); break;
523 case Label: sprintf(key, "%s%s", "/apps/celestia/labels/", name); break;
524 }
525
526 gconf_client_set_bool(client, key, value, NULL);
527 }
528