settings-gconf.cpp

来自「celestia源代码」· C++ 代码 · 共 468 行 · 第 1/2 页

CPP
468
字号
/* *  Celestia GTK+ Front-End *  Copyright (C) 2005 Pat Suwalski <pat@suwalski.net> * *  This program is free software; you can redistribute it and/or modify *  it under the terms of the GNU General Public License as published by *  the Free Software Foundation; either version 2 of the License, or *  (at your option) any later version. * *  $Id: settings-gconf.cpp,v 1.1 2005/12/06 03:19:36 suwalski Exp $ */#include <gtk/gtk.h>#include <gconf/gconf-client.h>#include <celengine/body.h>#include <celengine/galaxy.h>#include <celengine/render.h>#include "settings-gconf.h"#include "common.h"/* Definitions: GConf Callbacks */static void confLabels(GConfClient*, guint, GConfEntry*, AppData* app);static void confRender(GConfClient*, guint, GConfEntry*, AppData* app);static void confOrbits(GConfClient*, guint, GConfEntry*, AppData* app);static void confWinWidth(GConfClient*, guint, GConfEntry* e, AppData* app);static void confWinHeight(GConfClient*, guint, GConfEntry* e, AppData* app);static void confWinX(GConfClient*, guint, GConfEntry* e, AppData* app);static void confWinY(GConfClient*, guint, GConfEntry* e, AppData* app);static void confAmbientLight(GConfClient*, guint, GConfEntry* e, AppData* app);static void confVisualMagnitude(GConfClient*, guint, GConfEntry* e, AppData* app);static void confGalaxyLightGain(GConfClient*, guint, GConfEntry* e, AppData*);static void confShowLocalTime(GConfClient*, guint, GConfEntry* e, AppData* app);static void confVerbosity(GConfClient*, guint, GConfEntry* e, AppData* app);static void confFullScreen(GConfClient*, guint, GConfEntry* e, AppData* app);static void confStarStyle(GConfClient*, guint, GConfEntry* e, AppData* app);static void confAltSurfaceName(GConfClient*, guint, GConfEntry* e, AppData* app);/* Definitions: Helpers */static int readGConfRender(GConfClient* client);static int readGConfOrbits(GConfClient* client);static int readGConfLabels(GConfClient* client);static void gcSetFlag(int type, const char* name, gboolean value, GConfClient* client);/* ENTRY: Initializes the GConf connection */void initSettingsGConf(AppData* app){	app->client = gconf_client_get_default();	gconf_client_add_dir(app->client, "/apps/celestia", GCONF_CLIENT_PRELOAD_RECURSIVE, NULL);}/* ENTRY: Connects GConf keys to their callbacks */void initSettingsGConfNotifiers(AppData* app){	/* Add preference client notifiers. */	gconf_client_notify_add (app->client, "/apps/celestia/labels", (GConfClientNotifyFunc)confLabels, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/render", (GConfClientNotifyFunc)confRender, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/orbits", (GConfClientNotifyFunc)confOrbits, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/winWidth", (GConfClientNotifyFunc)confWinWidth, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/winHeight", (GConfClientNotifyFunc)confWinHeight, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/winX", (GConfClientNotifyFunc)confWinX, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/winY", (GConfClientNotifyFunc)confWinY, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/ambientLight", (GConfClientNotifyFunc)confAmbientLight, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/visualMagnitude", (GConfClientNotifyFunc)confVisualMagnitude, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/galaxyLightGain", (GConfClientNotifyFunc)confGalaxyLightGain, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/showLocalTime", (GConfClientNotifyFunc)confShowLocalTime, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/verbosity", (GConfClientNotifyFunc)confVerbosity, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/fullScreen", (GConfClientNotifyFunc)confFullScreen, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/starStyle", (GConfClientNotifyFunc)confStarStyle, app, NULL, NULL);	gconf_client_notify_add (app->client, "/apps/celestia/altSurfaceName", (GConfClientNotifyFunc)confAltSurfaceName, app, NULL, NULL);}/* ENTRY: Reads preferences required before initializing simulation */void applySettingsGConfPre(AppData* app, GConfClient* client){	int sizeX, sizeY, positionX, positionY;		/* Error checking occurs as values are used */	sizeX = gconf_client_get_int(client, "/apps/celestia/winWidth", NULL);	sizeY = gconf_client_get_int(client, "/apps/celestia/winHeight", NULL);	positionX = gconf_client_get_int(client, "/apps/celestia/winX", NULL);	positionY = gconf_client_get_int(client, "/apps/celestia/winY", NULL);	app->fullScreen = gconf_client_get_bool(client, "/apps/celestia/fullScreen", NULL);		setSaneWinSize(app, sizeX, sizeY);	setSaneWinPosition(app, positionX, positionY);}/* ENTRY: Reads and applies basic preferences */void applySettingsGConfMain(AppData* app, GConfClient* client){	int rf, om, lm;		/* All settings that need sanity checks get them */	setSaneAmbientLight(app, gconf_client_get_float(client, "/apps/celestia/ambientLight", NULL));	setSaneVisualMagnitude(app, gconf_client_get_float(client, "/apps/celestia/visualMagnitude", NULL));	setSaneGalaxyLightGain(gconf_client_get_float(client, "/apps/celestia/galaxyLightGain", NULL));	setSaneVerbosity(app, gconf_client_get_int(client, "/apps/celestia/verbosity", NULL));	setSaneStarStyle(app, (Renderer::StarStyle)gconf_client_get_int(client, "/apps/celestia/starStyle", NULL));	setSaneAltSurface(app, gconf_client_get_string(client, "/apps/celestia/altSurfaceName", NULL));		app->showLocalTime = gconf_client_get_bool(client, "/apps/celestia/showLocalTime", NULL);		/* Render Flags */	rf = readGConfRender(app->client);	app->renderer->setRenderFlags(rf);	/* Orbit Mode */	om = readGConfOrbits(app->client);	app->renderer->setOrbitMask(om);		/* Label Mode */	lm = readGConfLabels(app->client);	app->renderer->setLabelMode(lm);}/* ENTRY: Saves the final settings that are not updated on-the-fly */void saveSettingsGConf(AppData* app){	/* Save window position */	gconf_client_set_int(app->client, "/apps/celestia/winX", getWinX(app), NULL);	gconf_client_set_int(app->client, "/apps/celestia/winY", getWinY(app), NULL);		/* Save window  size */	gconf_client_set_int(app->client, "/apps/celestia/winWidth", getWinWidth(app), NULL);	gconf_client_set_int(app->client, "/apps/celestia/winHeight", getWinHeight(app), NULL);		g_object_unref (G_OBJECT (app->client));}/* UTILITY: Converts a binary render flag to individual keys */void gcSetRenderFlag(int flag, gboolean state, GConfClient* client){	switch (flag)	{		case Renderer::ShowStars: gcSetFlag(Render, "stars", state, client); break;		case Renderer::ShowPlanets: gcSetFlag(Render, "planets", state, client); break;		case Renderer::ShowGalaxies: gcSetFlag(Render, "galaxies", state, client); break;		case Renderer::ShowDiagrams: gcSetFlag(Render, "diagrams", state, client); break;		case Renderer::ShowCloudMaps: gcSetFlag(Render, "cloudMaps", state, client); break;		case Renderer::ShowOrbits: gcSetFlag(Render, "orbits", state, client); break;		case Renderer::ShowCelestialSphere: gcSetFlag(Render, "celestialSphere", state, client); break;		case Renderer::ShowNightMaps: gcSetFlag(Render, "nightMaps", state, client); break;		case Renderer::ShowAtmospheres: gcSetFlag(Render, "atmospheres", state, client); break;		case Renderer::ShowSmoothLines: gcSetFlag(Render, "smoothLines", state, client); break;		case Renderer::ShowEclipseShadows: gcSetFlag(Render, "eclipseShadows", state, client); break;		case Renderer::ShowRingShadows: gcSetFlag(Render, "ringShadows", state, client); break;		case Renderer::ShowBoundaries: gcSetFlag(Render, "boundaries", state, client); break;		case Renderer::ShowAutoMag: gcSetFlag(Render, "autoMag", state, client); break;		case Renderer::ShowCometTails: gcSetFlag(Render, "cometTails", state, client); break;		case Renderer::ShowMarkers: gcSetFlag(Render, "markers", state, client); break;		case Renderer::ShowPartialTrajectories: gcSetFlag(Render, "partialTrajectories", state, client); break;		case Renderer::ShowNebulae: gcSetFlag(Render, "nebulae", state, client); break;		case Renderer::ShowOpenClusters: gcSetFlag(Render, "openClusters", state, client); break;	}}/* UTILITY: Converts a binary orbit mask to individual keys */void gcSetOrbitMask(int flag, gboolean state, GConfClient* client){	switch (flag)	{		case Body::Planet: gcSetFlag(Orbit, "planet", state, client); break;		case Body::Moon: gcSetFlag(Orbit, "moon", state, client); break;		case Body::Asteroid: gcSetFlag(Orbit, "asteroid", state, client); break;		case Body::Spacecraft: gcSetFlag(Orbit, "spacecraft", state, client); break;		case Body::Comet: gcSetFlag(Orbit, "comet", state, client); break;		case Body::Invisible: gcSetFlag(Orbit, "invisible", state, client); break;		case Body::Unknown: gcSetFlag(Orbit, "unknown", state, client); break;	}}/* UTILITY: Converts a binary label mode to individual keys */void gcSetLabelMode(int flag, gboolean state, GConfClient* client){	switch (flag)	{		case Renderer::StarLabels: gcSetFlag(Label, "star", state, client); break;		case Renderer::PlanetLabels: gcSetFlag(Label, "planet", state, client); break;		case Renderer::MoonLabels: gcSetFlag(Label, "moon", state, client); break;		case Renderer::ConstellationLabels: gcSetFlag(Label, "constellation", state, client); break;		case Renderer::GalaxyLabels: gcSetFlag(Label, "galaxy", state, client); break;		case Renderer::AsteroidLabels: gcSetFlag(Label, "asteroid", state, client); break;		case Renderer::SpacecraftLabels: gcSetFlag(Label, "spacecraft", state, client); break;		case Renderer::LocationLabels: gcSetFlag(Label, "location", state, client); break;		case Renderer::CometLabels: gcSetFlag(Label, "comet", state, client); break;		case Renderer::NebulaLabels: gcSetFlag(Label, "nebula", state, client); break;		case Renderer::OpenClusterLabels: gcSetFlag(Label, "openCluster", state, client); break;		case Renderer::I18nConstellationLabels: gcSetFlag(Label, "i18n", state, client); break;	}}/* GCONF CALLBACK: Reloads labels upon change */static void confLabels(GConfClient*, guint, GConfEntry*, AppData* app){	int oldLabels = app->renderer->getLabelMode();		/* Reload all the labels */	int newLabels = readGConfLabels(app->client);	/* Set label flags */	if (newLabels != oldLabels)		app->renderer->setLabelMode(newLabels);}/* GCONF CALLBACK: Reloads render flags upon change */static void confRender(GConfClient*, guint, GConfEntry*, AppData* app){	int oldRender = app->renderer->getRenderFlags();		/* Reload all the render flags */	int newRender = readGConfRender(app->client);	/* Set render flags */	if (newRender != oldRender)		app->renderer->setRenderFlags(newRender);}/* GCONF CALLBACK: Reloads orbits upon change */static void confOrbits(GConfClient*, guint, GConfEntry*, AppData* app){

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?