aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/programs/Xserver/hw/dmx/config/dmxconfig.c
diff options
context:
space:
mode:
Diffstat (limited to 'nx-X11/programs/Xserver/hw/dmx/config/dmxconfig.c')
-rw-r--r--nx-X11/programs/Xserver/hw/dmx/config/dmxconfig.c499
1 files changed, 0 insertions, 499 deletions
diff --git a/nx-X11/programs/Xserver/hw/dmx/config/dmxconfig.c b/nx-X11/programs/Xserver/hw/dmx/config/dmxconfig.c
deleted file mode 100644
index 353ce11db..000000000
--- a/nx-X11/programs/Xserver/hw/dmx/config/dmxconfig.c
+++ /dev/null
@@ -1,499 +0,0 @@
-/* $XFree86$ */
-/*
- * Copyright 2002-2003 Red Hat Inc., Durham, North Carolina.
- *
- * All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation on the rights to use, copy, modify, merge,
- * publish, distribute, sublicense, and/or sell copies of the Software,
- * and to permit persons to whom the Software is furnished to do so,
- * subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial
- * portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
- * NON-INFRINGEMENT. IN NO EVENT SHALL RED HAT AND/OR THEIR SUPPLIERS
- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-/*
- * Authors:
- * Rickard E. (Rik) Faith <faith@redhat.com>
- *
- */
-
-/** \file
- * Provides interface for reading DMX configuration files and for
- * combining that information with command-line configuration parameters. */
-
-
-#ifdef HAVE_DMX_CONFIG_H
-#include <dmx-config.h>
-#endif
-
-#include "dmx.h"
-#include "dmxinput.h"
-#include "dmxconfig.h"
-#include "dmxparse.h"
-#include "dmxlog.h"
-#include "dmxcb.h"
-#include "dmxstat.h"
-#include "parser.h"
-
-extern int yyparse(void);
-extern FILE *yyin;
-
-static char *dmxXkbRules;
-static char *dmxXkbModel;
-static char *dmxXkbLayout;
-static char *dmxXkbVariant;
-static char *dmxXkbOptions;
-
-/** Stores lists of configuration information. */
-typedef struct DMXConfigListStruct {
- const char *name;
- struct DMXConfigListStruct *next;
-} DMXConfigList, *DMXConfigListPtr;
-
-/** This stucture stores the parsed configuration information. */
-typedef struct DMXConfigCmdStruct {
- const char *filename;
- const char *config;
- DMXConfigList *displays;
- DMXConfigList *inputs;
- DMXConfigList *xinputs;
-} DMXConfigCmd, *DMXConfigCmdPtr;
-
-DMXConfigEntryPtr dmxConfigEntry;
-static DMXConfigCmd dmxConfigCmd;
-
-static int dmxDisplaysFromCommandLine;
-
-/** Make a note that \a display is the name of an X11 display that
- * should be initialized as a backend (output) display. Called from
- * #ddxProcessArgument. */
-void dmxConfigStoreDisplay(const char *display)
-{
- DMXConfigListPtr entry = malloc(sizeof(*entry));
- entry->name = strdup(display);
- entry->next = NULL;
- if (!dmxConfigCmd.displays) dmxConfigCmd.displays = entry;
- else {
- DMXConfigList *pt;
- for (pt = dmxConfigCmd.displays; pt->next; pt = pt->next);
- if (!pt)
- dmxLog(dmxFatal, "dmxConfigStoreDisplay: end of list non-NULL\n");
- pt->next = entry;
- }
- ++dmxDisplaysFromCommandLine;
-}
-
-/** Make a note that \a input is the name of an X11 display that should
- * be used for input (either a backend or a console input device). */
-void dmxConfigStoreInput(const char *input)
-{
- DMXConfigListPtr entry = malloc(sizeof(*entry));
- entry->name = strdup(input);
- entry->next = NULL;
- if (!dmxConfigCmd.inputs) dmxConfigCmd.inputs = entry;
- else {
- DMXConfigList *pt;
- for (pt = dmxConfigCmd.inputs; pt->next; pt = pt->next);
- if (!pt)
- dmxLog(dmxFatal, "dmxConfigStoreInput: end of list non-NULL\n");
- pt->next = entry;
- }
-}
-
-/** Make a note that \a input is the name of an X11 display that should
- * be used for input from XInput extension devices. */
-void dmxConfigStoreXInput(const char *input)
-{
- DMXConfigListPtr entry = malloc(sizeof(*entry));
- entry->name = strdup(input);
- entry->next = NULL;
- if (!dmxConfigCmd.xinputs) dmxConfigCmd.xinputs = entry;
- else {
- DMXConfigList *pt;
- for (pt = dmxConfigCmd.xinputs; pt->next; pt = pt->next);
- if (!pt)
- dmxLog(dmxFatal, "dmxConfigStoreXInput: end of list non-NULL\n");
- pt->next = entry;
- }
-}
-
-/** Make a note that \a file is the configuration file. */
-void dmxConfigStoreFile(const char *file)
-{
- if (dmxConfigCmd.filename)
- dmxLog(dmxFatal, "Only one -configfile allowed\n");
- dmxConfigCmd.filename = strdup(file);
-}
-
-/** Make a note that \a config should be used as the configuration for
- * current instantiation of the DMX server. */
-void dmxConfigStoreConfig(const char *config)
-{
- if (dmxConfigCmd.config) dmxLog(dmxFatal, "Only one -config allowed\n");
- dmxConfigCmd.config = strdup(config);
-}
-
-static int dmxConfigReadFile(const char *filename, int debug)
-{
- FILE *str;
-
- if (!(str = fopen(filename, "r"))) return -1;
- dmxLog(dmxInfo, "Reading configuration file \"%s\"\n", filename);
- yyin = str;
- yydebug = debug;
- yyparse();
- fclose(str);
- return 0;
-}
-
-static const char *dmxConfigMatch(const char *target, DMXConfigEntryPtr entry)
-{
- DMXConfigVirtualPtr v = entry->virtual;
- const char *name = NULL;
-
- if (v && v->name) name = v->name;
-
- if (v && !dmxConfigCmd.config) return v->name ? v->name : "<noname>";
- if (!name) return NULL;
- if (!strcmp(name, target)) return name;
- return NULL;
-}
-
-static DMXScreenInfo *dmxConfigAddDisplay(const char *name,
- int scrnWidth, int scrnHeight,
- int scrnX, int scrnY,
- int scrnXSign, int scrnYSign,
- int rootWidth, int rootHeight,
- int rootX, int rootY,
- int rootXSign, int rootYSign)
-{
- DMXScreenInfo *dmxScreen;
-
- if (!(dmxScreens = realloc(dmxScreens,
- (dmxNumScreens+1) * sizeof(*dmxScreens))))
- dmxLog(dmxFatal,
- "dmxConfigAddDisplay: realloc failed for screen %d (%s)\n",
- dmxNumScreens, name);
-
- dmxScreen = &dmxScreens[dmxNumScreens];
- memset(dmxScreen, 0, sizeof(*dmxScreen));
- dmxScreen->name = name;
- dmxScreen->index = dmxNumScreens;
- dmxScreen->scrnWidth = scrnWidth;
- dmxScreen->scrnHeight = scrnHeight;
- dmxScreen->scrnX = scrnX;
- dmxScreen->scrnY = scrnY;
- dmxScreen->scrnXSign = scrnXSign;
- dmxScreen->scrnYSign = scrnYSign;
- dmxScreen->rootWidth = rootWidth;
- dmxScreen->rootHeight = rootHeight;
- dmxScreen->rootX = rootX;
- dmxScreen->rootY = rootY;
- dmxScreen->stat = dmxStatAlloc();
- ++dmxNumScreens;
- return dmxScreen;
-}
-
-DMXInputInfo *dmxConfigAddInput(const char *name, int core)
-{
- DMXInputInfo *dmxInput;
-
- if (!(dmxInputs = realloc(dmxInputs,
- (dmxNumInputs+1) * sizeof(*dmxInputs))))
- dmxLog(dmxFatal,
- "dmxConfigAddInput: realloc failed for input %d (%s)\n",
- dmxNumInputs, name);
-
- dmxInput = &dmxInputs[dmxNumInputs];
-
- memset(dmxInput, 0, sizeof(*dmxInput));
- dmxInput->name = name;
- dmxInput->inputIdx = dmxNumInputs;
- dmxInput->scrnIdx = -1;
- dmxInput->core = core;
- ++dmxNumInputs;
- return dmxInput;
-}
-
-static void dmxConfigCopyFromDisplay(DMXConfigDisplayPtr d)
-{
- DMXScreenInfo *dmxScreen;
-
- dmxScreen = dmxConfigAddDisplay(d->name,
- d->scrnWidth, d->scrnHeight,
- d->scrnX, d->scrnY,
- d->scrnXSign, d->scrnYSign,
- d->rootWidth, d->rootHeight,
- d->rootX, d->rootY,
- d->rootXSign, d->rootXSign);
- dmxScreen->where = PosAbsolute;
- dmxScreen->whereX = d->rootXOrigin;
- dmxScreen->whereY = d->rootYOrigin;
-}
-
-static void dmxConfigCopyFromWall(DMXConfigWallPtr w)
-{
- DMXConfigStringPtr pt;
- DMXScreenInfo *dmxScreen;
- int edge = dmxNumScreens;
- int last = dmxNumScreens;
-
- if (!w->xwall && !w->ywall) { /* Try to make it square */
- int count;
- for (pt = w->nameList, count = 0; pt; pt = pt->next) ++count;
- w->xwall = sqrt(count) + .5;
- }
-
- for (pt = w->nameList; pt; pt = pt->next) {
- dmxScreen = dmxConfigAddDisplay(pt->string, w->width, w->height,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
- if (pt == w->nameList) { /* Upper left */
- dmxScreen->where = PosAbsolute;
- dmxScreen->whereX = 0;
- dmxScreen->whereY = 0;
- } else if (w->xwall) { /* Tile left to right, then top to bottom */
- if (!((dmxNumScreens-1) % w->xwall)) {
- dmxScreen->where = PosBelow;
- dmxScreen->whereRefScreen = edge;
- edge = dmxNumScreens-1;
- } else {
- dmxScreen->where = PosRightOf;
- dmxScreen->whereRefScreen = last;
- }
- } else { /* Tile top to bottom, then left to right */
- if (!((dmxNumScreens-1) % w->ywall)) {
- dmxScreen->where = PosRightOf;
- dmxScreen->whereRefScreen = edge;
- edge = dmxNumScreens-1;
- } else {
- dmxScreen->where = PosBelow;
- dmxScreen->whereRefScreen = last;
- }
-
- }
- last = dmxNumScreens-1;
- if (dmxScreen->where == PosAbsolute)
- dmxLog(dmxInfo, "Added %s at %d %d\n",
- pt->string, dmxScreen->whereX, dmxScreen->whereY);
- else
- dmxLog(dmxInfo, "Added %s %s %s\n",
- pt->string,
- dmxScreen->where == PosBelow ? "below" : "right of",
- dmxScreens[dmxScreen->whereRefScreen].name);
- }
-}
-
-static void dmxConfigCopyFromOption(DMXConfigOptionPtr o)
-{
- DMXConfigStringPtr pt;
- int argc = 0;
- char **argv = NULL;
-
- if (serverGeneration != 1) return; /* FIXME: only do once, for now */
- if (!o || !o->string) return;
- for (pt = o->option; pt; pt = pt->next) {
- if (pt->string) {
- ++argc;
- argv = realloc(argv, (argc+1) * sizeof(*argv));
- argv[argc] = (char *)pt->string;
- }
- }
- argv[0] = NULL;
- ProcessCommandLine(argc+1, argv);
- free(argv);
-}
-
-static void dmxConfigCopyFromParam(DMXConfigParamPtr p)
-{
- const char **argv;
- int argc;
-
- if ((argv = dmxConfigLookupParam(p, "xkbrules", &argc)) && argc == 2) {
- dmxConfigSetXkbRules(argv[1]);
- } else if ((argv = dmxConfigLookupParam(p, "xkbmodel", &argc))
- && argc == 2) {
- dmxConfigSetXkbModel(argv[1]);
- } else if ((argv = dmxConfigLookupParam(p, "xkblayout", &argc))
- && argc == 2) {
- dmxConfigSetXkbLayout(argv[1]);
- } else if ((argv = dmxConfigLookupParam(p, "xkbvariant", &argc))
- && argc == 2) {
- dmxConfigSetXkbVariant(argv[1]);
- } else if ((argv = dmxConfigLookupParam(p, "xkboptions", &argc))
- && argc == 2) {
- dmxConfigSetXkbOptions(argv[1]);
- }
-}
-
-static void dmxConfigCopyData(DMXConfigVirtualPtr v)
-{
- DMXConfigSubPtr sub;
-
- if (v->dim) dmxSetWidthHeight(v->dim->x, v->dim->y);
- else dmxSetWidthHeight(0, 0);
- for (sub = v->subentry; sub; sub = sub->next) {
- switch (sub->type) {
- case dmxConfigDisplay: dmxConfigCopyFromDisplay(sub->display); break;
- case dmxConfigWall: dmxConfigCopyFromWall(sub->wall); break;
- case dmxConfigOption: dmxConfigCopyFromOption(sub->option); break;
- case dmxConfigParam: dmxConfigCopyFromParam(sub->param); break;
- default:
- dmxLog(dmxFatal,
- "dmxConfigCopyData: not a display, wall, or value\n");
- }
- }
-}
-
-static void dmxConfigFromCommandLine(void)
-{
- DMXConfigListPtr pt;
-
- dmxLog(dmxInfo, "Using configuration from command line\n");
- for (pt = dmxConfigCmd.displays; pt; pt = pt->next) {
- DMXScreenInfo *dmxScreen = dmxConfigAddDisplay(pt->name,
- 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0);
- if (dmxNumScreens == 1) {
- dmxScreen->where = PosAbsolute;
- dmxScreen->whereX = 0;
- dmxScreen->whereY = 0;
- dmxLog(dmxInfo, "Added %s at %d %d\n",
- dmxScreen->name, dmxScreen->whereX, dmxScreen->whereY);
- } else {
- dmxScreen->where = PosRightOf;
- dmxScreen->whereRefScreen = dmxNumScreens - 2;
- if (dmxScreen->whereRefScreen < 0) dmxScreen->whereRefScreen = 0;
- dmxLog(dmxInfo, "Added %s %s %s\n",
- dmxScreen->name,
- dmxScreen->where == PosBelow ? "below" : "right of",
- dmxScreens[dmxScreen->whereRefScreen].name);
- }
- }
-}
-
-static void dmxConfigFromConfigFile(void)
-{
- DMXConfigEntryPtr pt;
- const char *name;
-
- for (pt = dmxConfigEntry; pt; pt = pt->next) {
- /* FIXME -- if an input is specified, use it */
- if (pt->type != dmxConfigVirtual) continue;
- if ((name = dmxConfigMatch(dmxConfigCmd.config, pt))) {
- dmxLog(dmxInfo, "Using configuration \"%s\"\n", name);
- dmxConfigCopyData(pt->virtual);
- return;
- }
- }
- dmxLog(dmxFatal, "Could not find configuration \"%s\" in \"%s\"\n",
- dmxConfigCmd.config, dmxConfigCmd.filename);
-}
-
-static void dmxConfigConfigInputs(void)
-{
- DMXConfigListPtr pt;
-
- if (dmxNumInputs) return;
-
- if (dmxConfigCmd.inputs) { /* Use command line */
- for (pt = dmxConfigCmd.inputs; pt; pt = pt->next)
- dmxConfigAddInput(pt->name, TRUE);
- } else if (dmxNumScreens) { /* Use first display */
- dmxConfigAddInput(dmxScreens[0].name, TRUE);
- } else { /* Use dummy */
- dmxConfigAddInput("dummy", TRUE);
- }
-
- if (dmxConfigCmd.xinputs) { /* Non-core devices from command line */
- for (pt = dmxConfigCmd.xinputs; pt; pt = pt->next)
- dmxConfigAddInput(pt->name, FALSE);
- }
-}
-
-/** Set up the appropriate global variables so that the DMX server will
- * be initialized using the configuration specified in the config file
- * and on the command line. */
-void dmxConfigConfigure(void)
-{
- if (dmxConfigEntry) {
- dmxConfigFreeEntry(dmxConfigEntry);
- dmxConfigEntry = NULL;
- }
- if (dmxConfigCmd.filename) {
- if (dmxConfigCmd.displays)
- dmxLog(dmxWarning,
- "Using configuration file \"%s\" instead of command line\n",
- dmxConfigCmd.filename);
- dmxConfigReadFile(dmxConfigCmd.filename, 0);
- dmxConfigFromConfigFile();
- } else {
- if (dmxConfigCmd.config)
- dmxLog(dmxWarning,
- "Configuration name (%s) without configuration file\n",
- dmxConfigCmd.config);
- dmxConfigFromCommandLine();
- }
- dmxConfigConfigInputs();
-}
-
-/** This function determines the number of displays we WILL have and
- * sets MAXSCREENS to that value. This is difficult since the number
- * depends on the command line (which is easy to count) or on the config
- * file, which has to be parsed. */
-void dmxConfigSetMaxScreens(void)
-{
- static int processing = 0;
-
- if (processing) return; /* Prevent reentry via ProcessCommandLine */
- processing = 1;
- if (dmxConfigCmd.filename) {
- if (!dmxNumScreens)
- dmxConfigConfigure();
-#ifndef MAXSCREENS
- SetMaxScreens(dmxNumScreens);
-#endif
- } else
-#ifndef MAXSCREENS
- SetMaxScreens(dmxDisplaysFromCommandLine);
-#endif
- processing = 0;
-}
-
-/** This macro is used to generate the following access methods:
- * - dmxConfig{Set,Get}rules
- * - dmxConfig{Set,Get}model
- * - dmxConfig{Set,Get}layout
- * - dmxConfig{Set,Get}variant
- * - dmxConfig{Set,Get}options
- * These methods are used to read and write information about the keyboard. */
-
-#define GEN(param,glob,def) \
- void dmxConfigSet##glob(const char *param) { \
- if (dmx##glob) free((void *)dmx##glob); \
- dmx##glob = strdup(param); \
- } \
- char *dmxConfigGet##glob(void) { \
- return (char *)(dmx##glob ? dmx##glob : def); \
- }
-
-GEN(rules, XkbRules, DMX_DEFAULT_XKB_RULES)
-GEN(model, XkbModel, DMX_DEFAULT_XKB_MODEL)
-GEN(layout, XkbLayout, DMX_DEFAULT_XKB_LAYOUT)
-GEN(variant, XkbVariant, DMX_DEFAULT_XKB_VARIANT)
-GEN(options, XkbOptions, DMX_DEFAULT_XKB_OPTIONS)
-