2279 lines
		
	
	
		
			64 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			2279 lines
		
	
	
		
			64 KiB
		
	
	
	
		
			C
		
	
	
	
/*
 | 
						|
 * Copyright (c) 2000 by Conectiva S.A. (http://www.conectiva.com)
 | 
						|
 * 
 | 
						|
 * 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
 | 
						|
 * 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 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 NONINFRINGEMENT.  IN NO EVENT SHALL
 | 
						|
 * CONECTIVA LINUX 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.
 | 
						|
 * 
 | 
						|
 * Except as contained in this notice, the name of Conectiva Linux shall
 | 
						|
 * not be used in advertising or otherwise to promote the sale, use or other
 | 
						|
 * dealings in this Software without prior written authorization from
 | 
						|
 * Conectiva Linux.
 | 
						|
 *
 | 
						|
 * Author: Paulo César Pereira de Andrade <pcpa@conectiva.com.br>
 | 
						|
 *
 | 
						|
 */
 | 
						|
 | 
						|
#include <X11/IntrinsicP.h>
 | 
						|
#include <X11/StringDefs.h>
 | 
						|
#include <X11/Composite.h>
 | 
						|
#include <X11/Shell.h>
 | 
						|
#include <X11/Xaw/AsciiText.h>
 | 
						|
#include <X11/Xaw/Simple.h>
 | 
						|
#include <X11/Xaw/Paned.h>
 | 
						|
#include <X11/Xaw/Form.h>
 | 
						|
#include <X11/Xaw/Command.h>
 | 
						|
#include <X11/Xaw/MenuButton.h>
 | 
						|
#include <X11/Xaw/SmeBSB.h>
 | 
						|
#include <X11/Xaw/SmeLine.h>
 | 
						|
#include <X11/Xaw/SimpleMenP.h>
 | 
						|
#include <X11/Xaw/Dialog.h>
 | 
						|
#include <stdio.h>
 | 
						|
#include <stdlib.h>
 | 
						|
#include <unistd.h>
 | 
						|
#include <time.h>
 | 
						|
#include "xf86config.h"
 | 
						|
#include "mouse-cfg.h"
 | 
						|
#include "keyboard-cfg.h"
 | 
						|
#include "card-cfg.h"
 | 
						|
#include "monitor-cfg.h"
 | 
						|
#include "screen-cfg.h"
 | 
						|
#include "screen.h"
 | 
						|
#include "cards.h"
 | 
						|
#include "options.h"
 | 
						|
#include "vidmode.h"
 | 
						|
#include "help.h"
 | 
						|
#include "stubs.h"
 | 
						|
 | 
						|
#define randomize()		srand((unsigned)time((time_t*)NULL))
 | 
						|
#ifdef PROJECT_ROOT
 | 
						|
#define DefaultXFree86Dir	PROJECT_ROOT
 | 
						|
#else
 | 
						|
#define DefaultXFree86Dir	"/usr"
 | 
						|
#endif
 | 
						|
 | 
						|
#define IS_KBDDRIV(S) ((strcasecmp((S),"kbd") == 0))
 | 
						|
 | 
						|
/*
 | 
						|
 * Prototypes
 | 
						|
 */
 | 
						|
void DrawCables(void);
 | 
						|
static void DrawCable(Display*, Window, int, int, int, int);
 | 
						|
static void ComputerEventHandler(Widget, XtPointer, XEvent*, Boolean*);
 | 
						|
void SelectDeviceAction(Widget, XEvent*, String*, Cardinal*);
 | 
						|
void MoveDeviceAction(Widget, XEvent*, String*, Cardinal*);
 | 
						|
void UnselectDeviceAction(Widget, XEvent*, String*, Cardinal*);
 | 
						|
void RenameLayoutAction(Widget, XEvent*, String*, Cardinal*);
 | 
						|
void DevicePopupMenu(Widget, XEvent*, String*, Cardinal*);
 | 
						|
void DevicePopdownMenu(Widget, XEvent*, String*, Cardinal*);
 | 
						|
void AddDeviceCallback(Widget, XtPointer, XtPointer);
 | 
						|
void QuitCallback(Widget, XtPointer, XtPointer);
 | 
						|
void SmeConfigureDeviceCallback(Widget, XtPointer, XtPointer);
 | 
						|
void ConfigureDeviceCallback(Widget, XtPointer, XtPointer);
 | 
						|
void EnableDeviceCallback(Widget, XtPointer, XtPointer);
 | 
						|
void DisableDeviceCallback(Widget, XtPointer, XtPointer);
 | 
						|
void RemoveDeviceCallback(Widget, XtPointer, XtPointer);
 | 
						|
void InitializeDevices(void);
 | 
						|
void SetConfigModeCallback(Widget, XtPointer, XtPointer);
 | 
						|
void SelectLayoutCallback(Widget, XtPointer, XtPointer);
 | 
						|
void DefaultLayoutCallback(Widget, XtPointer, XtPointer);
 | 
						|
void RemoveLayoutCallback(Widget, XtPointer, XtPointer);
 | 
						|
void OptionsCallback(Widget, XtPointer, XtPointer);
 | 
						|
xf86cfgDevice *AddDevice(int, XtPointer, int, int);
 | 
						|
static Bool AskConfig(void);
 | 
						|
void WriteConfigAction(Widget, XEvent*, String*, Cardinal*);
 | 
						|
static void ScreenSetup(Bool);
 | 
						|
void QuitAction(Widget, XEvent*, String*, Cardinal*);
 | 
						|
void PopdownErrorCallback(Widget, XtPointer, XtPointer);
 | 
						|
static void ErrorCancelAction(Widget, XEvent*, String*, Cardinal*);
 | 
						|
static void QuitCancelAction(Widget, XEvent*, String*, Cardinal*);
 | 
						|
static void HelpCallback(Widget, XtPointer, XtPointer);
 | 
						|
void UpdateMenuDeviceList(int);
 | 
						|
 | 
						|
extern void AccessXConfigureStart(void);
 | 
						|
extern void AccessXConfigureEnd(void);
 | 
						|
extern void CloseAccessXAction(Widget, XEvent*, String*, Cardinal*);
 | 
						|
 | 
						|
#ifdef HAS_NCURSES
 | 
						|
extern void TextMode(void);
 | 
						|
#endif
 | 
						|
 | 
						|
static void Usage(void);
 | 
						|
 | 
						|
/*
 | 
						|
 * Initialization
 | 
						|
 */
 | 
						|
Widget toplevel, work, config, layout, layoutsme, layoutp, topMenu;
 | 
						|
XtAppContext appcon;
 | 
						|
 | 
						|
Pixmap menuPixmap;
 | 
						|
 | 
						|
char *XF86Config_path = NULL;
 | 
						|
char *XF86Module_path = NULL;
 | 
						|
char *XFree86_path = NULL;
 | 
						|
char *XF86Font_path = NULL;
 | 
						|
char *XF86RGB_path = NULL;
 | 
						|
char *XkbConfig_path = NULL;
 | 
						|
char *XFree86Dir;
 | 
						|
static char XF86Config_path_static[1024];
 | 
						|
static char XkbConfig_path_static[1024];
 | 
						|
Bool xf86config_set = False;
 | 
						|
 | 
						|
int textmode = False;
 | 
						|
#ifdef USE_MODULES
 | 
						|
int nomodules = False;
 | 
						|
#endif
 | 
						|
int  noverify = False;
 | 
						|
 | 
						|
xf86cfgComputer computer;
 | 
						|
xf86cfgDevice cpu_device;
 | 
						|
Cursor no_cursor;
 | 
						|
static Widget device, layoutm, popup, commands;
 | 
						|
static int xpos, ypos;
 | 
						|
int sxpos, sypos;
 | 
						|
static char no_cursor_data[] = { 0,0,0,0, 0,0,0,0 };
 | 
						|
static GC cablegc, cablegcshadow;
 | 
						|
Atom wm_delete_window;
 | 
						|
static Bool config_set = False;
 | 
						|
static Widget mouseSme, mouseMenu, keyboardSme, keyboardMenu,
 | 
						|
       cardSme, cardMenu, monitorSme, monitorMenu;
 | 
						|
 | 
						|
int config_mode = CONFIG_LAYOUT;
 | 
						|
 | 
						|
static XtActionsRec actions[] = {
 | 
						|
    {"filter-card", CardFilterAction},
 | 
						|
    {"select-device", SelectDeviceAction},
 | 
						|
    {"move-device", MoveDeviceAction},
 | 
						|
    {"unselect-device", UnselectDeviceAction},
 | 
						|
    {"device-popup", DevicePopupMenu},
 | 
						|
    {"device-popdown", DevicePopdownMenu},
 | 
						|
    {"rename-layout", RenameLayoutAction},
 | 
						|
    {"write-config", WriteConfigAction},
 | 
						|
    {"quit", QuitAction},
 | 
						|
    {"vidmode-restore", VidmodeRestoreAction},
 | 
						|
    {"config-cancel", ConfigCancelAction},
 | 
						|
    {"options-cancel", OptionsCancelAction},
 | 
						|
    {"error-cancel", ErrorCancelAction},
 | 
						|
    {"quit-cancel", QuitCancelAction},
 | 
						|
    {"addmode-cancel", CancelAddModeAction},
 | 
						|
    {"accessx-close", CloseAccessXAction},
 | 
						|
    {"testmode-cancel", CancelTestModeAction},
 | 
						|
    {"help-close", HelpCancelAction},
 | 
						|
    {"expert-close", ExpertCloseAction},
 | 
						|
#ifdef USE_MODULES
 | 
						|
    {"module-options-close", ModuleOptionsCancelAction},
 | 
						|
#endif
 | 
						|
};
 | 
						|
 | 
						|
static char *device_names[] = {
 | 
						|
/* MOUSE	*/
 | 
						|
    "mouse",
 | 
						|
/* KEYBOARD	*/
 | 
						|
    "keyboard",
 | 
						|
/* CARD		*/
 | 
						|
    "card",
 | 
						|
/* MONITOR	*/
 | 
						|
    "monitor",
 | 
						|
/* SCREEN	*/
 | 
						|
    "screen",
 | 
						|
};
 | 
						|
 | 
						|
static XtResource appResources[] = {
 | 
						|
#if 0
 | 
						|
    {"config",  __XCONFIGFILE__,  XtRString, sizeof(char*),
 | 
						|
      0, XtRString, "/etc/X11/"__XCONFIGFILE__},
 | 
						|
#endif
 | 
						|
    {"menuBitmap",  "MenuBitmap",  XtRString, sizeof(char*),
 | 
						|
      0, XtRString, "menu10"},
 | 
						|
};
 | 
						|
 | 
						|
static void
 | 
						|
Usage(void)
 | 
						|
{
 | 
						|
    fprintf(stderr,
 | 
						|
"Usage:\n"
 | 
						|
"   xorgcfg [-option ...]\n"
 | 
						|
"\n"
 | 
						|
"Options:\n"
 | 
						|
"   -config <"__XCONFIGFILE__">   Alternate configuration file.\n"
 | 
						|
"   -modulepath <module-path>  "__XSERVERNAME__" modules location.\n"
 | 
						|
"   -serverpath <server-path>  X server to start (if $DISPLAY is not defined).\n"
 | 
						|
"   -fontpath   <font-path>    Font path for fonts.\n"
 | 
						|
#ifdef HAS_NCURSES
 | 
						|
"   -textmode                  Use this option for the text only interface.\n"
 | 
						|
#endif
 | 
						|
#ifdef USE_MODULES
 | 
						|
"   -nomodules                 Use this option if xorgcfg is slow to start.\n"
 | 
						|
"   -verbose <number>          Verbosity used in the loader (default 1).\n"
 | 
						|
#endif
 | 
						|
"   -verify                    Verify modules/options integrity.\n"
 | 
						|
);
 | 
						|
 | 
						|
    exit(1);
 | 
						|
}
 | 
						|
 | 
						|
/*
 | 
						|
 * Implementation
 | 
						|
 */
 | 
						|
int
 | 
						|
main(int argc, char *argv[])
 | 
						|
{
 | 
						|
    Widget pane, hpane, expert, popup, mouse, keyboard, card, monitor;
 | 
						|
    Widget bottom, sme, smemodeline, help, quit, layopt;
 | 
						|
    XColor color, tmp;
 | 
						|
    Pixmap pixmap;
 | 
						|
    XGCValues values;
 | 
						|
    XF86ConfLayoutPtr lay;
 | 
						|
    int i, startedx;
 | 
						|
    char *menuPixmapPath = NULL;
 | 
						|
    XrmValue from, to;
 | 
						|
 | 
						|
    if ((XFree86Dir = getenv("XWINHOME")) == NULL)
 | 
						|
	XFree86Dir = DefaultXFree86Dir;
 | 
						|
 | 
						|
    chdir(XFree86Dir);
 | 
						|
 | 
						|
#ifdef USE_MODULES
 | 
						|
    xf86Verbose = 1;
 | 
						|
#endif
 | 
						|
    noverify = True;
 | 
						|
 | 
						|
    for (i = 1; i < argc; i++) {
 | 
						|
	if (strcmp(argv[i], "-config") == 0 ||
 | 
						|
	    strcmp(argv[i], "-xorgconfig") == 0 ||
 | 
						|
	    strcmp(argv[i], "-xf86config") == 0) {
 | 
						|
	    if (i + 1 < argc) {
 | 
						|
		XF86Config_path = argv[++i];
 | 
						|
		config_set = True;
 | 
						|
	    }
 | 
						|
	} else if (strcmp(argv[i], "-modulepath") == 0) {
 | 
						|
	    if (i + 1 < argc)
 | 
						|
		XF86Module_path = argv[++i];
 | 
						|
	} else if (strcmp(argv[i], "-serverpath") == 0) {
 | 
						|
	    if (i + 1 < argc)
 | 
						|
		XFree86_path = argv[++i];
 | 
						|
	} else if (strcmp(argv[i], "-fontpath") == 0) {
 | 
						|
	    if (i + 1 < argc)
 | 
						|
		XF86Font_path = argv[++i];
 | 
						|
        }
 | 
						|
#ifdef HAS_NCURSES
 | 
						|
	else if (strcmp(argv[i], "-textmode") == 0)
 | 
						|
	    textmode = True;
 | 
						|
#endif
 | 
						|
#ifdef USE_MODULES
 | 
						|
	else if (strcmp(argv[i], "-nomodules") == 0)
 | 
						|
	    nomodules = True;
 | 
						|
	else if (strcmp(argv[i], "-verbose") == 0) {
 | 
						|
	    if (i + 1 < argc)
 | 
						|
		xf86Verbose = atoi(argv[++i]);
 | 
						|
	}
 | 
						|
#endif
 | 
						|
	else if (strcmp(argv[i], "-verify") == 0)
 | 
						|
	    noverify = False;
 | 
						|
	else
 | 
						|
	    Usage();
 | 
						|
    }
 | 
						|
 | 
						|
#ifdef HAS_NCURSES
 | 
						|
    if (textmode) {
 | 
						|
	TextMode();
 | 
						|
	exit(0);
 | 
						|
    }
 | 
						|
#endif
 | 
						|
    
 | 
						|
    startedx = startx();
 | 
						|
    if (XF86Config_path == NULL)
 | 
						|
	XF86Config_path = XtNewString(__XCONFIGFILE__);
 | 
						|
    if (XkbConfig_path == NULL) {
 | 
						|
	XmuSnprintf(XkbConfig_path_static, sizeof(XkbConfig_path_static),
 | 
						|
		    "%s/%s%s", XFree86Dir, XkbConfigDir, XkbConfigFile);
 | 
						|
	XkbConfig_path = XkbConfig_path_static;
 | 
						|
    }
 | 
						|
    toplevel = XtAppInitialize(&appcon, "XOrgCfg",
 | 
						|
		    	       NULL, 0,
 | 
						|
			       &argc, argv,
 | 
						|
			       NULL, NULL, 0);
 | 
						|
    if (DPY == NULL)
 | 
						|
	DPY = XtDisplay(toplevel);
 | 
						|
 | 
						|
    XtGetApplicationResources(toplevel, (XtPointer)&menuPixmapPath,
 | 
						|
			      appResources, XtNumber(appResources), NULL, 0);
 | 
						|
    if (menuPixmapPath && strlen(menuPixmapPath)) {
 | 
						|
	from.size = strlen(menuPixmapPath);
 | 
						|
	from.addr = menuPixmapPath;
 | 
						|
	to.size = sizeof(Pixmap);
 | 
						|
	to.addr = (XtPointer)&(menuPixmap);
 | 
						|
	XtConvertAndStore(toplevel, XtRString, &from, XtRBitmap, &to);
 | 
						|
    }
 | 
						|
 | 
						|
    XtAppAddActions(appcon, actions, XtNumber(actions));
 | 
						|
 | 
						|
    XawSimpleMenuAddGlobalActions(appcon);
 | 
						|
    XtRegisterGrabAction(DevicePopupMenu, True,
 | 
						|
			 ButtonPressMask | ButtonReleaseMask,
 | 
						|
			 GrabModeAsync, GrabModeAsync);
 | 
						|
 | 
						|
    pane = XtCreateManagedWidget("pane", panedWidgetClass,
 | 
						|
				 toplevel, NULL, 0);
 | 
						|
    hpane = XtVaCreateManagedWidget("hpane", panedWidgetClass, pane,
 | 
						|
				    XtNorientation, XtorientHorizontal, NULL);
 | 
						|
    topMenu = XtCreateManagedWidget("topM", menuButtonWidgetClass,
 | 
						|
				 hpane, NULL, 0);
 | 
						|
    expert = XtCreateManagedWidget("expert", commandWidgetClass, hpane, NULL, 0);
 | 
						|
    XtAddCallback(expert, XtNcallback, ExpertCallback, NULL);
 | 
						|
    popup = XtCreatePopupShell("menu", simpleMenuWidgetClass,
 | 
						|
			       topMenu, NULL, 0);
 | 
						|
    sme = XtCreateManagedWidget("layout", smeBSBObjectClass,
 | 
						|
				popup, NULL, 0);
 | 
						|
    XtAddCallback(sme, XtNcallback, SetConfigModeCallback,
 | 
						|
		  (XtPointer)CONFIG_LAYOUT);
 | 
						|
    sme = XtCreateManagedWidget("screen", smeBSBObjectClass,
 | 
						|
				popup, NULL, 0);
 | 
						|
    XtAddCallback(sme, XtNcallback, SetConfigModeCallback,
 | 
						|
		  (XtPointer)CONFIG_SCREEN);
 | 
						|
    smemodeline = XtCreateManagedWidget("modeline", smeBSBObjectClass,
 | 
						|
					popup, NULL, 0);
 | 
						|
    XtAddCallback(smemodeline, XtNcallback, SetConfigModeCallback,
 | 
						|
		  (XtPointer)CONFIG_MODELINE);
 | 
						|
    sme = XtCreateManagedWidget("accessx", smeBSBObjectClass,
 | 
						|
				popup, NULL, 0);
 | 
						|
    XtAddCallback(sme, XtNcallback, SetConfigModeCallback,
 | 
						|
		  (XtPointer)CONFIG_ACCESSX);
 | 
						|
 | 
						|
    commands = XtCreateManagedWidget("commands", formWidgetClass,
 | 
						|
				     pane, NULL, 0);
 | 
						|
 | 
						|
    mouse = XtVaCreateManagedWidget("mouse", menuButtonWidgetClass,
 | 
						|
				    commands, XtNmenuName, "mouseP", NULL);
 | 
						|
    popup = XtCreatePopupShell("mouseP", simpleMenuWidgetClass,
 | 
						|
			       mouse, NULL, 0);
 | 
						|
    sme = XtCreateManagedWidget("new", smeBSBObjectClass,
 | 
						|
				popup, NULL, 0);
 | 
						|
    XtAddCallback(sme, XtNcallback, AddDeviceCallback, (XtPointer)MOUSE);
 | 
						|
    mouseSme = XtCreateManagedWidget("configure", smeBSBObjectClass,
 | 
						|
				     popup, NULL, 0);
 | 
						|
    XtAddCallback(mouseSme, XtNcallback, SmeConfigureDeviceCallback,
 | 
						|
		  (XtPointer)MOUSE);
 | 
						|
 | 
						|
    keyboard = XtVaCreateManagedWidget("keyboard", menuButtonWidgetClass,
 | 
						|
				       commands, XtNmenuName, "keyboardP", NULL);
 | 
						|
    popup = XtCreatePopupShell("keyboardP", simpleMenuWidgetClass,
 | 
						|
			       keyboard, NULL, 0);
 | 
						|
    sme = XtCreateManagedWidget("new", smeBSBObjectClass,
 | 
						|
				popup, NULL, 0);
 | 
						|
    XtAddCallback(sme, XtNcallback, AddDeviceCallback, (XtPointer)KEYBOARD);
 | 
						|
    keyboardSme = XtCreateManagedWidget("configure", smeBSBObjectClass,
 | 
						|
					popup, NULL, 0);
 | 
						|
    XtAddCallback(keyboardSme, XtNcallback, SmeConfigureDeviceCallback,
 | 
						|
		  (XtPointer)KEYBOARD);
 | 
						|
 | 
						|
    card = XtVaCreateManagedWidget("card", menuButtonWidgetClass,
 | 
						|
				   commands, XtNmenuName, "cardP", NULL);
 | 
						|
    popup = XtCreatePopupShell("cardP", simpleMenuWidgetClass,
 | 
						|
			       card, NULL, 0);
 | 
						|
    sme = XtCreateManagedWidget("new", smeBSBObjectClass,
 | 
						|
				popup, NULL, 0);
 | 
						|
    XtAddCallback(sme, XtNcallback, AddDeviceCallback, (XtPointer)CARD);
 | 
						|
    cardSme = XtCreateManagedWidget("configure", smeBSBObjectClass,
 | 
						|
				    popup, NULL, 0);
 | 
						|
    XtAddCallback(cardSme, XtNcallback, SmeConfigureDeviceCallback,
 | 
						|
		  (XtPointer)CARD);
 | 
						|
 | 
						|
    monitor = XtVaCreateManagedWidget("monitor", menuButtonWidgetClass,
 | 
						|
				      commands, XtNmenuName, "monitorP", NULL);
 | 
						|
    popup = XtCreatePopupShell("monitorP", simpleMenuWidgetClass,
 | 
						|
			       monitor, NULL, 0);
 | 
						|
    sme = XtCreateManagedWidget("new", smeBSBObjectClass,
 | 
						|
				popup, NULL, 0);
 | 
						|
    XtAddCallback(sme, XtNcallback, AddDeviceCallback, (XtPointer)MONITOR);
 | 
						|
    monitorSme = XtCreateManagedWidget("configure", smeBSBObjectClass,
 | 
						|
				       popup, NULL, 0);
 | 
						|
    XtAddCallback(monitorSme, XtNcallback, SmeConfigureDeviceCallback,
 | 
						|
		  (XtPointer)MONITOR);
 | 
						|
 | 
						|
    work = XtCreateManagedWidget("work", compositeWidgetClass,
 | 
						|
				 pane, NULL, 0);
 | 
						|
 | 
						|
    bottom = XtCreateManagedWidget("bottom", formWidgetClass,
 | 
						|
				   pane, NULL, 0);
 | 
						|
    layoutm = XtCreateManagedWidget("select", menuButtonWidgetClass,
 | 
						|
				    bottom, NULL, 0);
 | 
						|
    layout = XtVaCreateManagedWidget("layout", asciiTextWidgetClass,
 | 
						|
				     bottom,
 | 
						|
				     XtNeditType, XawtextEdit,
 | 
						|
				     NULL);
 | 
						|
    layoutp = XtCreatePopupShell("menu", simpleMenuWidgetClass,
 | 
						|
				 bottom, NULL, 0);
 | 
						|
    sme = XtCreateManagedWidget("new", smeBSBObjectClass, layoutp,
 | 
						|
				NULL, 0);
 | 
						|
    XtAddCallback(sme, XtNcallback, SelectLayoutCallback, NULL);
 | 
						|
    help = XtCreateManagedWidget("help", commandWidgetClass,
 | 
						|
				 bottom, NULL, 0);
 | 
						|
    XtAddCallback(help, XtNcallback, HelpCallback, NULL);
 | 
						|
    quit = XtCreateManagedWidget("quit", commandWidgetClass,
 | 
						|
				 bottom, NULL, 0);
 | 
						|
    XtAddCallback(quit, XtNcallback, QuitCallback, NULL);
 | 
						|
 | 
						|
    XtRealizeWidget(toplevel);
 | 
						|
    XtRealizeWidget(topMenu);
 | 
						|
 | 
						|
    pixmap = XCreateBitmapFromData(XtDisplay(toplevel), XtWindow(toplevel),
 | 
						|
				   no_cursor_data, 8, 8);
 | 
						|
    XAllocNamedColor(XtDisplay(toplevel), toplevel->core.colormap, "black",
 | 
						|
		     &color, &tmp);
 | 
						|
    no_cursor = XCreatePixmapCursor(XtDisplay(toplevel), pixmap, pixmap,
 | 
						|
				    &color, &color, 0, 0);
 | 
						|
 | 
						|
    XAllocNamedColor(XtDisplay(toplevel), toplevel->core.colormap, "gray55",
 | 
						|
		     &color, &tmp);
 | 
						|
    values.line_width = 3;
 | 
						|
    values.foreground = color.pixel;
 | 
						|
    cablegcshadow = XCreateGC(XtDisplay(toplevel), XtWindow(toplevel),
 | 
						|
			GCForeground | GCLineWidth, &values);
 | 
						|
    XAllocNamedColor(XtDisplay(toplevel), toplevel->core.colormap, "gray85",
 | 
						|
		     &color, &tmp);
 | 
						|
    values.line_width = 1;
 | 
						|
    values.foreground = color.pixel;
 | 
						|
    cablegc = XCreateGC(XtDisplay(toplevel), XtWindow(toplevel),
 | 
						|
			GCForeground | GCLineWidth, &values);
 | 
						|
 | 
						|
    computer.cpu = XtCreateManagedWidget("cpu", simpleWidgetClass,
 | 
						|
					 work, NULL, 0);
 | 
						|
    cpu_device.widget = computer.cpu;
 | 
						|
    cpu_device.type = SERVER;
 | 
						|
 | 
						|
    XtAddEventHandler(work, ExposureMask, False,
 | 
						|
		      ComputerEventHandler, (XtPointer)NULL);
 | 
						|
 | 
						|
    wm_delete_window = XInternAtom(DPY, "WM_DELETE_WINDOW", False);
 | 
						|
    XSetWMProtocols(DPY, XtWindow(toplevel), &wm_delete_window, 1);
 | 
						|
 | 
						|
    StartConfig();
 | 
						|
    InitializeDevices();
 | 
						|
    UpdateMenuDeviceList(MOUSE);
 | 
						|
    UpdateMenuDeviceList(KEYBOARD);
 | 
						|
    UpdateMenuDeviceList(CARD);
 | 
						|
    UpdateMenuDeviceList(MONITOR);
 | 
						|
    XtSetSensitive(smemodeline, VideoModeInitialize());
 | 
						|
 | 
						|
    lay = XF86Config->conf_layout_lst;
 | 
						|
    while (lay != NULL) {
 | 
						|
	sme = XtVaCreateManagedWidget("sme", smeBSBObjectClass,
 | 
						|
				      layoutp,
 | 
						|
				      XtNlabel, lay->lay_identifier,
 | 
						|
				      XtNmenuName, lay->lay_identifier,
 | 
						|
				      XtNleftBitmap, menuPixmap,
 | 
						|
				      NULL);
 | 
						|
	XtAddCallback(sme, XtNcallback, SelectLayoutCallback, (XtPointer)lay);
 | 
						|
	if (layoutsme == NULL)
 | 
						|
	    layoutsme = sme;
 | 
						|
	layopt = XtCreatePopupShell(lay->lay_identifier, simpleMenuWidgetClass,
 | 
						|
				    layoutp, NULL, 0);
 | 
						|
	sme = XtCreateManagedWidget("default", smeBSBObjectClass,
 | 
						|
				    layopt, NULL, 0);
 | 
						|
	XtAddCallback(sme, XtNcallback, DefaultLayoutCallback, NULL);
 | 
						|
	sme = XtCreateManagedWidget("remove", smeBSBObjectClass,
 | 
						|
				    layopt, NULL, 0);
 | 
						|
	XtAddCallback(sme, XtNcallback, RemoveLayoutCallback, NULL);
 | 
						|
	XtRealizeWidget(layopt);
 | 
						|
 | 
						|
	lay = (XF86ConfLayoutPtr)(lay->list.next);
 | 
						|
    }
 | 
						|
    SelectLayoutCallback(layoutsme,
 | 
						|
			 XF86Config->conf_layout_lst, NULL);
 | 
						|
 | 
						|
    startaccessx();
 | 
						|
    if (startedx) {
 | 
						|
	switch (fork()) {
 | 
						|
	    case 0: {
 | 
						|
		char path[PATH_MAX];
 | 
						|
 | 
						|
		XmuSnprintf(path, sizeof(path), "%s/bin/twm", XFree86Dir);
 | 
						|
		execl(path, "twm", (void *)NULL);
 | 
						|
		exit(-127);
 | 
						|
	    }	break;
 | 
						|
	    case -1:
 | 
						|
		fprintf(stderr, "Cannot fork.\n");
 | 
						|
		exit(1);
 | 
						|
		break;
 | 
						|
	    default:
 | 
						|
		break;
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
#ifdef USE_MODULES
 | 
						|
    if (!nomodules)
 | 
						|
	LoaderInitializeOptions();
 | 
						|
#endif
 | 
						|
 | 
						|
    /* ReadCardsDatabase() must be called after LoaderInitializeOptions() */
 | 
						|
    ReadCardsDatabase();
 | 
						|
 | 
						|
    if (!config_set && startedx) {
 | 
						|
	XtFree(XF86Config_path);
 | 
						|
#ifndef XF86CONFIG
 | 
						|
# define XF86CONFIG __XCONFIGFILE__
 | 
						|
#endif
 | 
						|
#ifdef XF86CONFIGDIR
 | 
						|
	XF86Config_path = XtNewString(XF86CONFIGDIR "/" XF86CONFIG);
 | 
						|
#else
 | 
						|
	XF86Config_path = XtNewString("/etc/X11/" XF86CONFIG);
 | 
						|
#endif
 | 
						|
    }
 | 
						|
    XtAppMainLoop(appcon);
 | 
						|
    if (startedx)
 | 
						|
	endx();
 | 
						|
 | 
						|
    return (0);
 | 
						|
}
 | 
						|
 | 
						|
static Widget shell_cf;
 | 
						|
static int write_cf, asking_cf;
 | 
						|
static int cf_state = 0;
 | 
						|
#define	CF_XF86Config	1
 | 
						|
#define	CF_XKBConfig	2
 | 
						|
#define CF_First	CF_XF86Config
 | 
						|
#define CF_Last		CF_XKBConfig
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
static void
 | 
						|
WriteConfig(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    asking_cf = 0;
 | 
						|
    XtPopdown(shell_cf);
 | 
						|
    write_cf = (long)user_data;
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
QuitCancelAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
 | 
						|
{
 | 
						|
    WriteConfig(w, (XtPointer)-1, NULL);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
WriteConfigAction(Widget w, XEvent *event,
 | 
						|
		  String *params, Cardinal *num_params)
 | 
						|
{
 | 
						|
    WriteConfig(w, (XtPointer)True, NULL);
 | 
						|
}
 | 
						|
 | 
						|
static Bool
 | 
						|
AskConfig(void)
 | 
						|
{
 | 
						|
    static Widget dialog;
 | 
						|
 | 
						|
    if (shell_cf == NULL) {
 | 
						|
	Arg args[1];
 | 
						|
	char *l, *label;
 | 
						|
	int len;
 | 
						|
 | 
						|
	shell_cf = XtCreatePopupShell("quit", transientShellWidgetClass,
 | 
						|
				      toplevel, NULL, 0);
 | 
						|
	dialog = XtVaCreateManagedWidget("ask", dialogWidgetClass, shell_cf,
 | 
						|
					 XtNvalue, XF86Config_path, NULL);
 | 
						|
	XawDialogAddButton(dialog, "yes", WriteConfig, (XtPointer)1);
 | 
						|
	XawDialogAddButton(dialog, "no", WriteConfig, (XtPointer)0);
 | 
						|
	XawDialogAddButton(dialog, "cancel", WriteConfig, (XtPointer)-1);
 | 
						|
	XtRealizeWidget(shell_cf);
 | 
						|
	XSetWMProtocols(DPY, XtWindow(shell_cf), &wm_delete_window, 1);
 | 
						|
	XtSetArg(args[0], XtNlabel, &l);
 | 
						|
	XtGetValues(dialog, args, 1);
 | 
						|
	label = XtMalloc(len = (strlen(l) + strlen(XF86CONFIG) + 2));
 | 
						|
	XmuSnprintf(label, len, "%s\n", XF86CONFIG);
 | 
						|
	strcat(label, l);
 | 
						|
	XtSetArg(args[0], XtNlabel, label);
 | 
						|
	XtSetValues(dialog, args, 1);
 | 
						|
	XtFree(label);
 | 
						|
    }
 | 
						|
    else {
 | 
						|
	Arg args[2];
 | 
						|
	Cardinal num_args = 0;
 | 
						|
	char *l, *label = NULL, *str = "";
 | 
						|
 | 
						|
	XtSetArg(args[0], XtNlabel, &l);
 | 
						|
	XtGetValues(dialog, args, 1);
 | 
						|
	switch (cf_state) {
 | 
						|
	    case CF_XF86Config:
 | 
						|
		str = XF86CONFIG;
 | 
						|
		XtSetArg(args[num_args], XtNvalue, XF86Config_path);
 | 
						|
		++num_args;
 | 
						|
		break;
 | 
						|
	    case CF_XKBConfig:
 | 
						|
		str = "XKB";
 | 
						|
		XtSetArg(args[num_args], XtNvalue, XkbConfig_path);
 | 
						|
		++num_args;
 | 
						|
		break;
 | 
						|
	}
 | 
						|
	l = strchr(l, '\n');
 | 
						|
	if (l != NULL) {
 | 
						|
	    label = XtMalloc(strlen(str) + strlen(l) + 1);
 | 
						|
	    strcpy(label, str);
 | 
						|
	    strcat(label, l);
 | 
						|
	    XtSetArg(args[num_args], XtNlabel, label);
 | 
						|
	    ++num_args;
 | 
						|
	}
 | 
						|
	XtSetValues(dialog, args, num_args);
 | 
						|
	if (l != NULL)
 | 
						|
	    XtFree(label);
 | 
						|
    }
 | 
						|
 | 
						|
    asking_cf = 1;
 | 
						|
 | 
						|
    XtPopup(shell_cf, XtGrabExclusive);
 | 
						|
    while (asking_cf)
 | 
						|
	XtAppProcessEvent(XtWidgetToApplicationContext(shell_cf), XtIMAll);
 | 
						|
 | 
						|
    if (write_cf > 0) {
 | 
						|
	switch (cf_state) {
 | 
						|
	    case CF_XF86Config:
 | 
						|
		XF86Config_path = XawDialogGetValueString(dialog);
 | 
						|
		XmuSnprintf(XF86Config_path_static,
 | 
						|
			    sizeof(XF86Config_path_static),
 | 
						|
			    "%s", XF86Config_path);
 | 
						|
		XF86Config_path = XF86Config_path_static;
 | 
						|
		break;
 | 
						|
	    case CF_XKBConfig:
 | 
						|
		XkbConfig_path = XawDialogGetValueString(dialog);
 | 
						|
		XmuSnprintf(XkbConfig_path_static,
 | 
						|
			    sizeof(XkbConfig_path_static),
 | 
						|
			    "%s", XkbConfig_path);
 | 
						|
		XkbConfig_path = XkbConfig_path_static;
 | 
						|
		break;
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
    return (write_cf);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
PopdownErrorCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    XtPopdown((Widget)user_data);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
ErrorCancelAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
 | 
						|
{
 | 
						|
    XtPopdown((Widget)w);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
QuitAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
 | 
						|
{
 | 
						|
    QuitCallback(w, NULL, NULL);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
QuitCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    for (cf_state = CF_First; cf_state <= CF_Last; cf_state++) {
 | 
						|
	if (cf_state == CF_XKBConfig && xkb_info == NULL)
 | 
						|
	    continue;
 | 
						|
	
 | 
						|
	switch (AskConfig()) {
 | 
						|
	    case 0:
 | 
						|
		break;
 | 
						|
	    case 1:
 | 
						|
		if ((cf_state == CF_XF86Config &&
 | 
						|
		     !xf86writeConfigFile(XF86Config_path, XF86Config)) ||
 | 
						|
		    (cf_state == CF_XKBConfig &&
 | 
						|
		     !WriteXKBConfiguration(XkbConfig_path,
 | 
						|
					    &xkb_info->config))) {
 | 
						|
		    static Widget shell;
 | 
						|
 | 
						|
		    if (shell == NULL) {
 | 
						|
			Widget dialog;
 | 
						|
 | 
						|
			shell = XtCreatePopupShell("error",
 | 
						|
				transientShellWidgetClass,
 | 
						|
				toplevel, NULL, 0);
 | 
						|
			dialog = XtVaCreateManagedWidget("notice",
 | 
						|
				 dialogWidgetClass,
 | 
						|
				 shell, XtNvalue, NULL,
 | 
						|
				 NULL);
 | 
						|
			XawDialogAddButton(dialog, "ok", PopdownErrorCallback,
 | 
						|
					   (XtPointer)shell);
 | 
						|
			XtRealizeWidget(shell);
 | 
						|
			XSetWMProtocols(DPY, XtWindow(shell),
 | 
						|
					&wm_delete_window, 1);
 | 
						|
		    }
 | 
						|
		    XtPopup(shell, XtGrabExclusive);
 | 
						|
		    return;
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	    default:
 | 
						|
		return;
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
    endx();
 | 
						|
    exit(0);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
InitializeDevices(void)
 | 
						|
{
 | 
						|
    xf86cfgDevice *device;
 | 
						|
    int mouse_x, mouse_y, keyboard_x, keyboard_y,
 | 
						|
	card_x, card_y, monitor_x, monitor_y, len;
 | 
						|
    XF86ConfInputPtr input = XF86Config->conf_input_lst;
 | 
						|
    XF86ConfDevicePtr card = XF86Config->conf_device_lst;
 | 
						|
    XF86ConfMonitorPtr monitor = XF86Config->conf_monitor_lst;
 | 
						|
    XF86OptionPtr flags = NULL;
 | 
						|
    char buffer[4096], *tip;
 | 
						|
    Arg args[1];
 | 
						|
 | 
						|
    if (XF86Config->conf_flags != NULL)
 | 
						|
	flags = XF86Config->conf_flags->flg_option_lst;
 | 
						|
 | 
						|
    len = 0;
 | 
						|
    while (flags && len < sizeof(buffer) - 1) {
 | 
						|
	len += XmuSnprintf(buffer + len, sizeof(buffer) - len,
 | 
						|
			   "Option     \"%s\"",
 | 
						|
			   flags->opt_name);
 | 
						|
	if (flags->opt_val != NULL)
 | 
						|
	    len += XmuSnprintf(buffer + len, sizeof(buffer) - len,
 | 
						|
			       " \"%s\"\n",
 | 
						|
			       flags->opt_val);
 | 
						|
	else
 | 
						|
	    len += XmuSnprintf(buffer + len, sizeof(buffer) - len,
 | 
						|
			       "%s", "\n");
 | 
						|
	flags = (XF86OptionPtr)(flags->list.next);
 | 
						|
    }
 | 
						|
 | 
						|
    if (len) {
 | 
						|
	tip = XtNewString(buffer);
 | 
						|
	XtSetArg(args[0], XtNtip, tip);
 | 
						|
	XtSetValues(computer.cpu, args, 1);
 | 
						|
    }
 | 
						|
 | 
						|
#define DEFAULT_MOUSE_WIDTH	30
 | 
						|
#define DEFAULT_MOUSE_HEIGHT	40
 | 
						|
#define DEFAULT_KEYBOARD_WIDTH	48
 | 
						|
#define DEFAULT_KEYBOARD_HEIGHT	36
 | 
						|
    mouse_x = work->core.width - (work->core.width >> 2);
 | 
						|
    mouse_y = work->core.height - DEFAULT_MOUSE_HEIGHT;
 | 
						|
    keyboard_x = 6;
 | 
						|
    keyboard_y = work->core.height - DEFAULT_KEYBOARD_HEIGHT;
 | 
						|
 | 
						|
    while (input != NULL) {
 | 
						|
	if (input->inp_driver) {
 | 
						|
	    if (strcasecmp(input->inp_driver, "mouse") == 0) {
 | 
						|
		device = AddDevice(MOUSE, (XtPointer)input, mouse_x, mouse_y);
 | 
						|
		SetTip(device);
 | 
						|
		if ((mouse_x += DEFAULT_MOUSE_WIDTH) > work->core.width) {
 | 
						|
		    if ((mouse_y -= DEFAULT_MOUSE_HEIGHT) < (work->core.height >> 1))
 | 
						|
			mouse_y = work->core.height >> 1;
 | 
						|
		    mouse_x = work->core.width - (work->core.width >> 2);
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	    else if (IS_KBDDRIV(input->inp_driver)) {
 | 
						|
		device = AddDevice(KEYBOARD, (XtPointer)input, keyboard_x, keyboard_y);
 | 
						|
		SetTip(device);
 | 
						|
		if ((keyboard_x += DEFAULT_KEYBOARD_WIDTH) >
 | 
						|
		    work->core.width - (work->core.width >> 2))  {
 | 
						|
		    if ((keyboard_y -= DEFAULT_KEYBOARD_HEIGHT) < (work->core.height >> 1))
 | 
						|
			keyboard_y = work->core.height >> 1;
 | 
						|
		    keyboard_x = 6;
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	}
 | 
						|
	input = (XF86ConfInputPtr)(input->list.next);
 | 
						|
    }
 | 
						|
 | 
						|
#define DEFAULT_CARD_WIDTH	45
 | 
						|
#define DEFAULT_CARD_HEIGHT	46
 | 
						|
    card_x = 6;
 | 
						|
    card_y = (work->core.height >> 1) - 20 - DEFAULT_CARD_HEIGHT;
 | 
						|
    while (card != NULL) {
 | 
						|
	device = AddDevice(CARD, (XtPointer)card, card_x, card_y);
 | 
						|
	SetTip(device);
 | 
						|
	if ((card_x += DEFAULT_CARD_WIDTH) > work->core.width) {
 | 
						|
	    if ((card_y -= DEFAULT_CARD_HEIGHT) < (work->core.height >> 2))
 | 
						|
		card_y = work->core.height >> 2;
 | 
						|
	    card_x = 6;
 | 
						|
	}
 | 
						|
	card = (XF86ConfDevicePtr)(card->list.next);
 | 
						|
    }
 | 
						|
 | 
						|
#define DEFAULT_MONITOR_WIDTH	48
 | 
						|
#define DEFAULT_MONITOR_HEIGHT	48
 | 
						|
    monitor_x = 6;
 | 
						|
    monitor_y = 6;
 | 
						|
    while (monitor != NULL) {
 | 
						|
	XF86ConfScreenPtr screen = XF86Config->conf_screen_lst;
 | 
						|
 | 
						|
	device = AddDevice(MONITOR, (XtPointer)monitor, monitor_x, monitor_y);
 | 
						|
	SetTip(device);
 | 
						|
	if ((monitor_x += DEFAULT_MONITOR_WIDTH) > work->core.width) {
 | 
						|
	    if ((monitor_y += DEFAULT_MONITOR_HEIGHT) >
 | 
						|
		(work->core.height >> 2) - DEFAULT_MONITOR_HEIGHT)
 | 
						|
		monitor_y = (work->core.height >> 2) - DEFAULT_MONITOR_HEIGHT;
 | 
						|
	    monitor_x = 6;
 | 
						|
	}
 | 
						|
 | 
						|
	while (screen != NULL) {
 | 
						|
	    if (screen->scrn_monitor == monitor) {
 | 
						|
		card = XF86Config->conf_device_lst;
 | 
						|
		while (card != NULL) {
 | 
						|
		    if (screen->scrn_device == card) {
 | 
						|
			xf86cfgScreen *scr = (xf86cfgScreen*)
 | 
						|
			    XtCalloc(1, sizeof(xf86cfgScreen));
 | 
						|
			int i;
 | 
						|
 | 
						|
			for (i = 0; i < computer.num_devices; i++)
 | 
						|
			    if ((XF86ConfDevicePtr)(computer.devices[i]->config)
 | 
						|
				== card)
 | 
						|
				break;
 | 
						|
			scr->screen = screen;
 | 
						|
			scr->card = computer.devices[i];
 | 
						|
			scr->monitor = device;
 | 
						|
			scr->refcount = 0;
 | 
						|
			++scr->card->refcount;
 | 
						|
			++scr->monitor->refcount;
 | 
						|
			computer.screens = (xf86cfgScreen**)
 | 
						|
				XtRealloc((XtPointer)computer.screens,
 | 
						|
					  sizeof(xf86cfgScreen*) *
 | 
						|
					  (computer.num_screens + 1));
 | 
						|
			CreateScreenWidget(scr);
 | 
						|
			scr->type = SCREEN;
 | 
						|
			computer.screens[computer.num_screens++] = scr;
 | 
						|
			SetTip((xf86cfgDevice*)scr);
 | 
						|
			break;
 | 
						|
		    }
 | 
						|
		    card = (XF86ConfDevicePtr)(card->list.next);
 | 
						|
		}
 | 
						|
		device->state = USED;
 | 
						|
	    }
 | 
						|
	    screen = (XF86ConfScreenPtr)(screen->list.next);
 | 
						|
	}
 | 
						|
 | 
						|
	monitor = (XF86ConfMonitorPtr)(monitor->list.next);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
xf86cfgDevice *
 | 
						|
AddDevice(int type, XtPointer config, int x, int y)
 | 
						|
{
 | 
						|
    switch (type) {
 | 
						|
	case MOUSE:
 | 
						|
	case KEYBOARD:
 | 
						|
	case CARD:
 | 
						|
	case MONITOR:
 | 
						|
	    computer.devices = (xf86cfgDevice**)
 | 
						|
		XtRealloc((XtPointer)computer.devices,
 | 
						|
			  sizeof(xf86cfgDevice*) * (computer.num_devices + 1));
 | 
						|
	    computer.devices[computer.num_devices] = (xf86cfgDevice*)
 | 
						|
		XtCalloc(1, sizeof(xf86cfgDevice));
 | 
						|
	    computer.devices[computer.num_devices]->config = config;
 | 
						|
	    computer.devices[computer.num_devices]->widget =
 | 
						|
		XtVaCreateManagedWidget(device_names[type], simpleWidgetClass,
 | 
						|
					work,
 | 
						|
					XtNx, x,
 | 
						|
					XtNy, y,
 | 
						|
					XtNtip, NULL,
 | 
						|
					NULL);
 | 
						|
	    computer.devices[computer.num_devices]->type = type;
 | 
						|
	    computer.devices[computer.num_devices]->state = UNUSED;
 | 
						|
	    computer.devices[computer.num_devices]->refcount = 0;
 | 
						|
	    ++computer.num_devices;
 | 
						|
	    break;
 | 
						|
	default:
 | 
						|
	    fprintf(stderr, "Bad argument to AddDevice.\n");
 | 
						|
	    exit(1);
 | 
						|
	    return (NULL);
 | 
						|
    }
 | 
						|
 | 
						|
    UpdateMenuDeviceList(type);
 | 
						|
 | 
						|
    return (computer.devices[computer.num_devices - 1]);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
static void
 | 
						|
HelpCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    char *topic = NULL;
 | 
						|
 | 
						|
    switch (config_mode) {
 | 
						|
	case CONFIG_LAYOUT:
 | 
						|
	    topic = HELP_DEVICES;
 | 
						|
	    break;
 | 
						|
	case CONFIG_SCREEN:
 | 
						|
	    topic = HELP_SCREEN;
 | 
						|
	    break;
 | 
						|
	case CONFIG_MODELINE:
 | 
						|
	    topic = HELP_MODELINE;
 | 
						|
	    break;
 | 
						|
	case CONFIG_ACCESSX:
 | 
						|
	    topic = HELP_ACCESSX;
 | 
						|
	    break;
 | 
						|
    }
 | 
						|
    Help(topic);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
SelectLayoutCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    int i, j;
 | 
						|
    XF86ConfLayoutPtr lay = (XF86ConfLayoutPtr)user_data;
 | 
						|
    XF86ConfInputrefPtr input;
 | 
						|
    XF86ConfAdjacencyPtr adj;
 | 
						|
    Widget sme, layopt;
 | 
						|
    Arg args[1];
 | 
						|
    char *str;
 | 
						|
 | 
						|
			       /* XXX Needs to check computer.layout,
 | 
						|
				* because this function should also create
 | 
						|
				* a new layout...
 | 
						|
				*/
 | 
						|
    if (lay == computer.layout && computer.layout)
 | 
						|
	return;
 | 
						|
 | 
						|
    if (computer.layout != NULL) {
 | 
						|
	for (i = 0; i < computer.num_layouts; i++) {
 | 
						|
	    if (computer.layouts[i]->layout == computer.layout)
 | 
						|
		break;
 | 
						|
	}
 | 
						|
	if (i < computer.num_layouts) {
 | 
						|
	    XtFree((XtPointer)computer.layouts[i]->screen);
 | 
						|
	    XtFree((XtPointer)computer.layouts[i]->position);
 | 
						|
	}
 | 
						|
	else {
 | 
						|
	    computer.layouts = (xf86cfgLayout**)
 | 
						|
		XtRealloc((XtPointer)computer.layouts, sizeof(xf86cfgLayout*) *
 | 
						|
			  (computer.num_layouts + 1));
 | 
						|
	    ++computer.num_layouts;
 | 
						|
	}
 | 
						|
	computer.layouts[i] = (xf86cfgLayout*)XtCalloc(1, sizeof(xf86cfgLayout));
 | 
						|
	computer.layouts[i]->layout = computer.layout;
 | 
						|
	computer.layouts[i]->num_layouts = computer.num_screens;
 | 
						|
	computer.layouts[i]->screen = (xf86cfgScreen**)
 | 
						|
	    XtMalloc(sizeof(xf86cfgScreen*) * computer.num_screens);
 | 
						|
	computer.layouts[i]->position = (XPoint*)
 | 
						|
	    XtMalloc(sizeof(XPoint) * computer.num_screens);
 | 
						|
	for (j = 0; j < computer.num_screens; j++) {
 | 
						|
	    computer.layouts[i]->screen[j] = computer.screens[j];
 | 
						|
	    computer.layouts[i]->position[j].x = computer.screens[j]->widget->core.x;
 | 
						|
	    computer.layouts[i]->position[j].y = computer.screens[j]->widget->core.y;
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
    if (lay != NULL) {
 | 
						|
	for (i = 0; i < computer.num_layouts; i++)
 | 
						|
	    if (computer.layouts[i]->layout == lay) {
 | 
						|
		for (j = 0; j < computer.layouts[i]->num_layouts; j++) {
 | 
						|
		    int k;
 | 
						|
 | 
						|
		    for (k = 0; k < computer.num_screens; k++)
 | 
						|
			if (computer.screens[k] == computer.layouts[i]->screen[j]) {
 | 
						|
			    XtMoveWidget(computer.screens[k]->widget,
 | 
						|
					 computer.layouts[i]->position[j].x,
 | 
						|
					 computer.layouts[i]->position[j].y);
 | 
						|
			}
 | 
						|
		}
 | 
						|
		break;
 | 
						|
	    }
 | 
						|
 | 
						|
	layoutsme = w;
 | 
						|
	XtSetArg(args[0], XtNlabel, &str);
 | 
						|
	XtGetValues(w, args, 1);
 | 
						|
	XtSetArg(args[0], XtNstring, str);
 | 
						|
	XtSetValues(layout, args, 1);
 | 
						|
    }
 | 
						|
 | 
						|
    computer.layout = lay;
 | 
						|
 | 
						|
    for (i = 0; i < computer.num_devices; i++)
 | 
						|
	computer.devices[i]->state = UNUSED;
 | 
						|
    for (i = 0; i < computer.num_screens; i++)
 | 
						|
	computer.screens[i]->state = UNUSED;
 | 
						|
 | 
						|
    if (lay == NULL) {
 | 
						|
	char name[64];
 | 
						|
	XF86ConfLayoutPtr l;
 | 
						|
	int num_layouts = 0;
 | 
						|
 | 
						|
	l = XF86Config->conf_layout_lst;
 | 
						|
	while (l != NULL) {
 | 
						|
	    if (l->lay_adjacency_lst == NULL &&
 | 
						|
		l->lay_inactive_lst == NULL &&
 | 
						|
		l->lay_input_lst == NULL &&
 | 
						|
		l->lay_option_lst == NULL &&
 | 
						|
		l->lay_comment == NULL) {
 | 
						|
		for (i = 0;
 | 
						|
		     i < ((CompositeWidget)layout)->composite.num_children; i++)
 | 
						|
		    if (strcmp(XtName(((CompositeWidget)layout)->composite.
 | 
						|
			       children[i]), l->lay_identifier) == 0) {
 | 
						|
			layoutsme = ((CompositeWidget)layout)->composite.children[i];
 | 
						|
		    }
 | 
						|
		computer.layout = l;
 | 
						|
		XtSetArg(args[0], XtNstring, l->lay_identifier);
 | 
						|
		XtSetValues(layout, args, 1);
 | 
						|
		if (config_mode == CONFIG_LAYOUT)
 | 
						|
		    DrawCables();
 | 
						|
		if (config_mode == CONFIG_SCREEN)
 | 
						|
		    ScreenSetup(True);
 | 
						|
		return;
 | 
						|
	    }
 | 
						|
	    ++num_layouts;
 | 
						|
	    l = (XF86ConfLayoutPtr)(l->list.next);
 | 
						|
	}
 | 
						|
	do {
 | 
						|
	    XmuSnprintf(name, sizeof(name), "Layout%d", num_layouts);
 | 
						|
	    ++num_layouts;
 | 
						|
	} while (xf86findLayout(name,
 | 
						|
		 XF86Config->conf_layout_lst) != NULL);
 | 
						|
	l = (XF86ConfLayoutPtr)XtCalloc(1, sizeof(XF86ConfLayoutRec));
 | 
						|
 | 
						|
	l->lay_identifier = XtNewString(name);
 | 
						|
	XF86Config->conf_layout_lst =
 | 
						|
	    xf86addLayout(XF86Config->conf_layout_lst, l);
 | 
						|
	layoutsme = XtVaCreateManagedWidget("sme", smeBSBObjectClass,
 | 
						|
					    layoutp,
 | 
						|
					    XtNlabel, name,
 | 
						|
					    XtNmenuName, l->lay_identifier,
 | 
						|
					    XtNleftBitmap, menuPixmap,
 | 
						|
					    NULL);
 | 
						|
	XtAddCallback(layoutsme, XtNcallback,
 | 
						|
		      SelectLayoutCallback, (XtPointer)l);
 | 
						|
 | 
						|
	layopt = XtCreatePopupShell(l->lay_identifier, simpleMenuWidgetClass,
 | 
						|
				    layoutp, NULL, 0);
 | 
						|
	sme = XtCreateManagedWidget("default", smeBSBObjectClass,
 | 
						|
				    layopt, NULL, 0);
 | 
						|
	XtAddCallback(sme, XtNcallback, DefaultLayoutCallback, NULL);
 | 
						|
	sme = XtCreateManagedWidget("remove", smeBSBObjectClass,
 | 
						|
				    layopt, NULL, 0);
 | 
						|
	XtAddCallback(sme, XtNcallback, RemoveLayoutCallback, NULL);
 | 
						|
	XtRealizeWidget(layopt);
 | 
						|
 | 
						|
	computer.layout = l;
 | 
						|
	XtSetArg(args[0], XtNstring, name);
 | 
						|
	XtSetValues(layout, args, 1);
 | 
						|
	if (config_mode == CONFIG_LAYOUT)
 | 
						|
	    DrawCables();
 | 
						|
	if (config_mode == CONFIG_SCREEN)
 | 
						|
	    ScreenSetup(True);
 | 
						|
	return;
 | 
						|
    }
 | 
						|
 | 
						|
    input = lay->lay_input_lst;
 | 
						|
    adj = lay->lay_adjacency_lst;
 | 
						|
 | 
						|
    for (i = 0; i < computer.num_devices; i++)
 | 
						|
	if (computer.devices[i]->config != NULL &&
 | 
						|
	    (computer.devices[i]->type == MOUSE ||
 | 
						|
	     computer.devices[i]->type == KEYBOARD)) {
 | 
						|
	    while (input != NULL) {
 | 
						|
		if (strcmp(input->iref_inputdev_str, ((XF86ConfInputPtr)
 | 
						|
		    (computer.devices[i]->config))->inp_identifier) == 0) {
 | 
						|
		    computer.devices[i]->state = USED;
 | 
						|
		    break;
 | 
						|
		}
 | 
						|
		input = (XF86ConfInputrefPtr)(input->list.next);
 | 
						|
	    }
 | 
						|
	    input = lay->lay_input_lst;
 | 
						|
	}
 | 
						|
 | 
						|
    for (i = 0; i < computer.num_devices; i++)
 | 
						|
	if (computer.devices[i]->type == CARD) {
 | 
						|
	    while (adj != NULL) {
 | 
						|
		XF86ConfScreenPtr screen = adj->adj_screen;
 | 
						|
 | 
						|
		if (computer.devices[i]->config != NULL &&
 | 
						|
		    strcmp(screen->scrn_device_str, ((XF86ConfDevicePtr)
 | 
						|
		    (computer.devices[i]->config))->dev_identifier) == 0) {
 | 
						|
		    int j;
 | 
						|
 | 
						|
		    for (j = 0; j < computer.num_screens; j++)
 | 
						|
			if (computer.screens[j]->card == computer.devices[i])
 | 
						|
			    break;
 | 
						|
		    computer.screens[j]->card->state = USED;
 | 
						|
		    if (computer.screens[j]->monitor != NULL)
 | 
						|
			computer.screens[j]->monitor->state = USED;
 | 
						|
		    computer.screens[j]->state = USED;
 | 
						|
		}
 | 
						|
 | 
						|
		adj = (XF86ConfAdjacencyPtr)(adj->list.next);
 | 
						|
	    }
 | 
						|
	    adj = lay->lay_adjacency_lst;
 | 
						|
	}
 | 
						|
 | 
						|
    if (config_mode == CONFIG_LAYOUT)
 | 
						|
	DrawCables();
 | 
						|
    else if (config_mode == CONFIG_SCREEN)
 | 
						|
	ScreenSetup(True);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
DefaultLayoutCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    Widget layopt, sme;
 | 
						|
    int i;
 | 
						|
    char *str;
 | 
						|
    XF86ConfLayoutPtr prev, tmp, lay;
 | 
						|
 | 
						|
    str = w && XtParent(w) ? XtName(XtParent(w)) : NULL;
 | 
						|
    if (str == NULL)
 | 
						|
	return;
 | 
						|
 | 
						|
    prev = XF86Config->conf_layout_lst;
 | 
						|
    lay = xf86findLayout(str, prev);
 | 
						|
    if (prev == lay)
 | 
						|
	return;
 | 
						|
 | 
						|
    tmp = prev;
 | 
						|
    while (tmp != NULL) {
 | 
						|
	if (tmp == lay)
 | 
						|
	    break;
 | 
						|
	prev = tmp;
 | 
						|
	tmp = (XF86ConfLayoutPtr)(tmp->list.next);
 | 
						|
    }
 | 
						|
 | 
						|
    for (i = 1; i < ((CompositeWidget)layoutp)->composite.num_children; i++)
 | 
						|
	XtDestroyWidget(((CompositeWidget)layoutp)->composite.children[i]);
 | 
						|
    for (i = 0; i < layoutp->core.num_popups; i++)
 | 
						|
	XtDestroyWidget(layoutp->core.popup_list[i]);
 | 
						|
 | 
						|
    prev->list.next = lay->list.next;
 | 
						|
    lay->list.next = XF86Config->conf_layout_lst;
 | 
						|
    XF86Config->conf_layout_lst = lay;
 | 
						|
 | 
						|
    layoutsme = NULL;
 | 
						|
    lay = XF86Config->conf_layout_lst;
 | 
						|
    while (lay != NULL) {
 | 
						|
	sme = XtVaCreateManagedWidget("sme", smeBSBObjectClass,
 | 
						|
				      layoutp,
 | 
						|
				      XtNlabel, lay->lay_identifier,
 | 
						|
				      XtNmenuName, lay->lay_identifier,
 | 
						|
				      XtNleftBitmap, menuPixmap,
 | 
						|
				      NULL);
 | 
						|
	XtAddCallback(sme, XtNcallback, SelectLayoutCallback, (XtPointer)lay);
 | 
						|
	if (layoutsme == NULL)
 | 
						|
	    layoutsme = sme;
 | 
						|
	layopt = XtCreatePopupShell(lay->lay_identifier, simpleMenuWidgetClass,
 | 
						|
				    layoutp, NULL, 0);
 | 
						|
	sme = XtCreateManagedWidget("default", smeBSBObjectClass,
 | 
						|
				    layopt, NULL, 0);
 | 
						|
	XtAddCallback(sme, XtNcallback, DefaultLayoutCallback, NULL);
 | 
						|
	sme = XtCreateManagedWidget("remove", smeBSBObjectClass,
 | 
						|
				    layopt, NULL, 0);
 | 
						|
	XtAddCallback(sme, XtNcallback, RemoveLayoutCallback, NULL);
 | 
						|
	XtRealizeWidget(layopt);
 | 
						|
 | 
						|
	lay = (XF86ConfLayoutPtr)(lay->list.next);
 | 
						|
    }
 | 
						|
    SelectLayoutCallback(layoutsme,
 | 
						|
			 XF86Config->conf_layout_lst, NULL);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
RemoveLayoutCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    XF86ConfLayoutPtr prev, tmp, lay, rem;
 | 
						|
    Widget sme = NULL;
 | 
						|
    int i;
 | 
						|
    char *str;
 | 
						|
    Arg args[1];
 | 
						|
 | 
						|
    str = w && XtParent(w) ? XtName(XtParent(w)) : NULL;
 | 
						|
    if (str == NULL)
 | 
						|
	return;
 | 
						|
 | 
						|
    prev = XF86Config->conf_layout_lst;
 | 
						|
    lay = xf86findLayout(str, prev);
 | 
						|
    tmp = prev;
 | 
						|
    while (tmp != NULL) {
 | 
						|
	if (tmp == lay)
 | 
						|
	    break;
 | 
						|
	prev = tmp;
 | 
						|
	tmp = (XF86ConfLayoutPtr)(tmp->list.next);
 | 
						|
    }
 | 
						|
 | 
						|
    rem = lay;
 | 
						|
    if (tmp != NULL)
 | 
						|
	lay = (XF86ConfLayoutPtr)(tmp->list.next);
 | 
						|
    if (lay == NULL && prev != tmp)
 | 
						|
	lay = prev;
 | 
						|
 | 
						|
    if (lay != NULL) {
 | 
						|
	int i;
 | 
						|
 | 
						|
	for (i = 0; i < ((CompositeWidget)layoutp)->composite.num_children;
 | 
						|
	    i++) {
 | 
						|
	    XtSetArg(args[0], XtNlabel, &str);
 | 
						|
	    XtGetValues(((CompositeWidget)layoutp)->composite.children[i],
 | 
						|
			args, 1);
 | 
						|
	    if (strcmp(lay->lay_identifier, str) == 0) {
 | 
						|
		layoutsme = ((CompositeWidget)layoutp)->composite.children[i];
 | 
						|
		break;
 | 
						|
	    }
 | 
						|
	}
 | 
						|
	SelectLayoutCallback(layoutsme, lay, NULL);
 | 
						|
    }
 | 
						|
    else {
 | 
						|
	computer.layout = NULL;
 | 
						|
	XtSetArg(args[0], XtNstring, "");
 | 
						|
	XtSetValues(layout, args, 1);
 | 
						|
 | 
						|
	for (i = 0; i < computer.num_devices; i++)
 | 
						|
	    computer.devices[i]->state = UNUSED;
 | 
						|
	DrawCables();
 | 
						|
    }
 | 
						|
 | 
						|
    for (i = 0; i < ((CompositeWidget)layoutp)->composite.num_children; i++) {
 | 
						|
	XtSetArg(args[0], XtNlabel, &str);
 | 
						|
	XtGetValues(((CompositeWidget)layoutp)->composite.children[i], args, 1);
 | 
						|
	if (strcmp(rem->lay_identifier, str) == 0) {
 | 
						|
	    sme = ((CompositeWidget)layoutp)->composite.children[i];
 | 
						|
	    break;
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
    xf86removeLayout(XF86Config, rem);
 | 
						|
    if (sme)
 | 
						|
	XtDestroyWidget(sme);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
SetTip(xf86cfgDevice *device)
 | 
						|
{
 | 
						|
    XF86OptionPtr option = NULL;
 | 
						|
    char *tip, buffer[4096];
 | 
						|
    Arg args[1];
 | 
						|
    int len = 0;
 | 
						|
 | 
						|
    XtSetArg(args[0], XtNtip, &tip);
 | 
						|
    XtGetValues(device->widget, args, 1);
 | 
						|
 | 
						|
    switch (device->type) {
 | 
						|
	case MOUSE: {
 | 
						|
	    XF86ConfInputPtr mouse = (XF86ConfInputPtr)device->config;
 | 
						|
 | 
						|
	    if (mouse == NULL)
 | 
						|
		return;
 | 
						|
	    len = XmuSnprintf(buffer, sizeof(buffer),
 | 
						|
			      "Identifier \"%s\"\n"
 | 
						|
			      "Driver     \"mouse\"\n",
 | 
						|
			      mouse->inp_identifier);
 | 
						|
	    option = mouse->inp_option_lst;
 | 
						|
	}   break;
 | 
						|
	case KEYBOARD: {
 | 
						|
    	    XF86ConfInputPtr keyboard = (XF86ConfInputPtr)device->config;
 | 
						|
 | 
						|
	    if (keyboard == NULL)
 | 
						|
		return;
 | 
						|
	    len = XmuSnprintf(buffer, sizeof(buffer),
 | 
						|
			      "Identifier \"%s\"\n"
 | 
						|
			      "Driver     \"keyboard\"\n",
 | 
						|
			      keyboard->inp_identifier);
 | 
						|
	    option = keyboard->inp_option_lst;
 | 
						|
	}   break;
 | 
						|
	case CARD: {
 | 
						|
	    XF86ConfDevicePtr card = (XF86ConfDevicePtr)device->config;
 | 
						|
 | 
						|
	    if (card == NULL)
 | 
						|
		return;
 | 
						|
	    len = XmuSnprintf(buffer, sizeof(buffer),
 | 
						|
			      "Identifier \"%s\"\n"
 | 
						|
			      "Driver     \"%s\"\n",
 | 
						|
			      card->dev_identifier,
 | 
						|
			      card->dev_driver);
 | 
						|
	    option = card->dev_option_lst;
 | 
						|
	}   break;
 | 
						|
	case MONITOR: {
 | 
						|
	    XF86ConfMonitorPtr monitor = (XF86ConfMonitorPtr)device->config;
 | 
						|
 | 
						|
	    if (monitor == NULL)
 | 
						|
		return;
 | 
						|
	    if (monitor->mon_vendor != NULL)
 | 
						|
		len = XmuSnprintf(buffer, sizeof(buffer),
 | 
						|
				  "Identifier \"%s\"\n"
 | 
						|
				  "Vendor     \"%s\"\n",
 | 
						|
				  monitor->mon_identifier,
 | 
						|
				  monitor->mon_vendor);
 | 
						|
	    else
 | 
						|
		len = XmuSnprintf(buffer, sizeof(buffer),
 | 
						|
				  "Identifier \"%s\"\n",
 | 
						|
				  monitor->mon_identifier);
 | 
						|
	    option = monitor->mon_option_lst;
 | 
						|
	}   break;
 | 
						|
	case SCREEN: {
 | 
						|
	    XF86ConfScreenPtr screen = (XF86ConfScreenPtr)device->config;
 | 
						|
 | 
						|
	    if (screen == NULL)
 | 
						|
		return;
 | 
						|
	    len = XmuSnprintf(buffer, sizeof(buffer),
 | 
						|
			      "Identifier \"%s\"\n",
 | 
						|
			      screen->scrn_identifier);
 | 
						|
	    if (screen->scrn_device_str != NULL)
 | 
						|
		len += XmuSnprintf(buffer + len, sizeof(buffer),
 | 
						|
				   "Device     \"%s\"\n",
 | 
						|
				   screen->scrn_device_str);
 | 
						|
	    if (screen->scrn_monitor_str != NULL)
 | 
						|
		len += XmuSnprintf(buffer + len, sizeof(buffer),
 | 
						|
				   "Monitor    \"%s\"\n",
 | 
						|
				   screen->scrn_monitor_str);
 | 
						|
	    option = screen->scrn_option_lst;
 | 
						|
	}   break;
 | 
						|
	case SERVER: {
 | 
						|
	    len = XmuSnprintf(buffer, sizeof(buffer),
 | 
						|
			      "%s\n", "Server Flags");
 | 
						|
	    option = XF86Config->conf_flags->flg_option_lst;
 | 
						|
	}   break;
 | 
						|
    }
 | 
						|
 | 
						|
    while (option && len < sizeof(buffer) - 1) {
 | 
						|
	len += XmuSnprintf(buffer + len, sizeof(buffer) - len,
 | 
						|
			   "Option     \"%s\"",
 | 
						|
			   option->opt_name);
 | 
						|
	if (option->opt_val != NULL)
 | 
						|
	    len += XmuSnprintf(buffer + len, sizeof(buffer) - len,
 | 
						|
			       " \"%s\"\n",
 | 
						|
			       option->opt_val);
 | 
						|
	else
 | 
						|
	    len += XmuSnprintf(buffer + len, sizeof(buffer) - len,
 | 
						|
			       "%s", "\n");
 | 
						|
	option = (XF86OptionPtr)(option->list.next);
 | 
						|
    }
 | 
						|
 | 
						|
    tip = buffer;
 | 
						|
    XtSetArg(args[0], XtNtip, tip);
 | 
						|
    XtSetValues(device->widget, args, 1);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
AddDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    AddDevice((long)user_data, NULL, 6, 6);
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
SmeConfigureDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    int i;
 | 
						|
 | 
						|
    switch ((long)user_data) {
 | 
						|
	case MOUSE:
 | 
						|
	case KEYBOARD:
 | 
						|
	case CARD:
 | 
						|
	case MONITOR:
 | 
						|
	    for (i = 0; i < computer.num_devices; i++)
 | 
						|
		if (computer.devices[i]->type == (long)user_data) {
 | 
						|
		    config = computer.devices[i]->widget;
 | 
						|
		    ConfigureDeviceCallback(w, NULL, NULL);
 | 
						|
		}
 | 
						|
	    break;
 | 
						|
 | 
						|
	/* hack for newly added devices */
 | 
						|
	case -(MOUSE + 100):
 | 
						|
	case -(KEYBOARD + 100):
 | 
						|
	case -(CARD + 100):
 | 
						|
	case -(MONITOR + 100):
 | 
						|
	    for (i = 0; i < computer.num_devices; i++)
 | 
						|
		if (-(computer.devices[i]->type + 100) == (long)user_data &&
 | 
						|
		    computer.devices[i]->config == NULL) {
 | 
						|
		    config = computer.devices[i]->widget;
 | 
						|
		    ConfigureDeviceCallback(w, NULL, NULL);
 | 
						|
		}
 | 
						|
	    break;
 | 
						|
 | 
						|
	default:
 | 
						|
	    for (i = 0; i < computer.num_devices; i++)
 | 
						|
		if (computer.devices[i]->config == user_data) {
 | 
						|
		    config = computer.devices[i]->widget;
 | 
						|
		    ConfigureDeviceCallback(w, NULL, NULL);
 | 
						|
		}
 | 
						|
	    break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
ConfigureDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    int i, j;
 | 
						|
 | 
						|
    if (config_mode == CONFIG_LAYOUT) {
 | 
						|
	for (i = 0; i < computer.num_devices; i++) {
 | 
						|
	    if (computer.devices[i]->widget == config) {
 | 
						|
		switch (computer.devices[i]->type) {
 | 
						|
		    case MOUSE: {
 | 
						|
			XF86ConfInputPtr mouse =
 | 
						|
			    MouseConfig(computer.devices[i]->config);
 | 
						|
 | 
						|
			if (mouse != NULL && computer.devices[i]->config == NULL) {
 | 
						|
			    XF86Config->conf_input_lst =
 | 
						|
				xf86addInput(XF86Config->conf_input_lst,
 | 
						|
					     mouse);
 | 
						|
			    computer.devices[i]->config = (XtPointer)mouse;
 | 
						|
			}
 | 
						|
			SetTip(computer.devices[i]);
 | 
						|
		    }	break;
 | 
						|
		    case KEYBOARD: {
 | 
						|
			XF86ConfInputPtr keyboard =
 | 
						|
			    KeyboardConfig(computer.devices[i]->config);
 | 
						|
 | 
						|
			if (keyboard != NULL && computer.devices[i]->config == NULL) {
 | 
						|
			    XF86Config->conf_input_lst =
 | 
						|
				xf86addInput(XF86Config->conf_input_lst,
 | 
						|
					     keyboard);
 | 
						|
			    computer.devices[i]->config = (XtPointer)keyboard;
 | 
						|
			}
 | 
						|
			SetTip(computer.devices[i]);
 | 
						|
		    }	break;
 | 
						|
		    case CARD: {
 | 
						|
			XF86ConfDevicePtr card =
 | 
						|
			    CardConfig(computer.devices[i]->config);
 | 
						|
 | 
						|
			if (card != NULL && computer.devices[i]->config == NULL) {
 | 
						|
			    XF86Config->conf_device_lst =
 | 
						|
				xf86addDevice(XF86Config->conf_device_lst,
 | 
						|
					      card);
 | 
						|
			    computer.devices[i]->config = (XtPointer)card;
 | 
						|
			}
 | 
						|
			SetTip(computer.devices[i]);
 | 
						|
			for (j = 0; j < computer.num_screens; j++)
 | 
						|
			    if (computer.screens[j]->card->widget == config)
 | 
						|
				SetTip((xf86cfgDevice*)computer.screens[j]);
 | 
						|
		    }	break;
 | 
						|
		    case MONITOR: {
 | 
						|
			XF86ConfMonitorPtr monitor =
 | 
						|
			    MonitorConfig(computer.devices[i]->config);
 | 
						|
 | 
						|
			if (monitor != NULL && computer.devices[i]->config == NULL) {
 | 
						|
			    XF86Config->conf_monitor_lst =
 | 
						|
				xf86addMonitor(XF86Config->conf_monitor_lst,
 | 
						|
					       monitor);
 | 
						|
			    computer.devices[i]->config = (XtPointer)monitor;
 | 
						|
			}
 | 
						|
			SetTip(computer.devices[i]);
 | 
						|
			for (j = 0; j < computer.num_screens; j++)
 | 
						|
			    if (computer.screens[j]->monitor->widget == config)
 | 
						|
				SetTip((xf86cfgDevice*)computer.screens[j]);
 | 
						|
		    }	break;
 | 
						|
		}
 | 
						|
		/* Need to update because it may have been renamed */
 | 
						|
		UpdateMenuDeviceList(computer.devices[i]->type);
 | 
						|
		break;
 | 
						|
	    }
 | 
						|
	}
 | 
						|
    }
 | 
						|
    else if (config_mode == CONFIG_SCREEN) {
 | 
						|
	for (i = 0; i < computer.num_screens; i++)
 | 
						|
	    if (computer.screens[i]->widget == config) {
 | 
						|
		if (ScreenConfig(computer.screens[i]->screen) != NULL)
 | 
						|
		    SetTip((xf86cfgDevice*)computer.screens[i]);
 | 
						|
	    }
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
OptionsCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    int i;
 | 
						|
    XF86OptionPtr *options = NULL;
 | 
						|
#ifdef USE_MODULES
 | 
						|
    xf86cfgModuleOptions *drv_opts = NULL;
 | 
						|
#endif
 | 
						|
 | 
						|
    if (config_mode == CONFIG_SCREEN) {
 | 
						|
	for (i = 0; i < computer.num_screens; i++)
 | 
						|
	    if (computer.screens[i]->widget == config) {
 | 
						|
		options = &(computer.screens[i]->screen->scrn_option_lst);
 | 
						|
		break;
 | 
						|
	    }
 | 
						|
    }
 | 
						|
    else {
 | 
						|
	for (i = 0; i < computer.num_devices; i++)
 | 
						|
	    if (computer.devices[i]->widget == config)
 | 
						|
		break;
 | 
						|
 | 
						|
	if (i >= computer.num_devices) {
 | 
						|
	    if (XF86Config->conf_flags == NULL)
 | 
						|
		XF86Config->conf_flags = (XF86ConfFlagsPtr)
 | 
						|
		    XtCalloc(1, sizeof(XF86ConfFlagsRec));
 | 
						|
	    options = &(XF86Config->conf_flags->flg_option_lst);
 | 
						|
	}
 | 
						|
	else {
 | 
						|
	    switch (computer.devices[i]->type) {
 | 
						|
		case MOUSE:
 | 
						|
		case KEYBOARD:
 | 
						|
		    options = (XF86OptionPtr*)&(((XF86ConfInputPtr)
 | 
						|
			(computer.devices[i]->config))->inp_option_lst);
 | 
						|
#ifdef USE_MODULES
 | 
						|
		    if (!nomodules) {
 | 
						|
			char *drv = ((XF86ConfInputPtr)
 | 
						|
				(computer.devices[i]->config))->inp_driver;
 | 
						|
 | 
						|
			if (drv) {
 | 
						|
			    drv_opts = module_options;
 | 
						|
			    while (drv_opts) {
 | 
						|
				if (drv_opts->type == InputModule &&
 | 
						|
				    strcmp(drv_opts->name, drv) == 0)
 | 
						|
				    break;
 | 
						|
				drv_opts = drv_opts->next;
 | 
						|
			    }
 | 
						|
			}
 | 
						|
		    }
 | 
						|
#endif
 | 
						|
 | 
						|
		    break;
 | 
						|
		case CARD:
 | 
						|
		    options = (XF86OptionPtr*)&(((XF86ConfDevicePtr)
 | 
						|
			(computer.devices[i]->config))->dev_option_lst);
 | 
						|
#ifdef USE_MODULES
 | 
						|
		    if (!nomodules) {
 | 
						|
			char *drv = ((XF86ConfDevicePtr)
 | 
						|
				(computer.devices[i]->config))->dev_driver;
 | 
						|
 | 
						|
			if (drv) {
 | 
						|
			    drv_opts = module_options;
 | 
						|
			    while (drv_opts) {
 | 
						|
				if (drv_opts->type == VideoModule &&
 | 
						|
				    strcmp(drv_opts->name, drv) == 0)
 | 
						|
				    break;
 | 
						|
				drv_opts = drv_opts->next;
 | 
						|
			    }
 | 
						|
			}
 | 
						|
		    }
 | 
						|
#endif
 | 
						|
		    break;
 | 
						|
		case MONITOR:
 | 
						|
		    options = (XF86OptionPtr*)&(((XF86ConfMonitorPtr)
 | 
						|
			(computer.devices[i]->config))->mon_option_lst);
 | 
						|
		    break;
 | 
						|
	    }
 | 
						|
	}
 | 
						|
    }
 | 
						|
 | 
						|
#ifdef USE_MODULES
 | 
						|
    OptionsPopup(options, drv_opts ? drv_opts->name : NULL,
 | 
						|
		 drv_opts ? drv_opts->option : NULL);
 | 
						|
#else
 | 
						|
    OptionsPopup(options);
 | 
						|
#endif
 | 
						|
    if (config_mode == CONFIG_SCREEN) {
 | 
						|
	XF86OptionPtr option, options;
 | 
						|
	int rotate = 0;
 | 
						|
 | 
						|
	options = computer.screens[i]->screen->scrn_option_lst;
 | 
						|
	if ((option = xf86findOption(options, "Rotate")) != NULL) {
 | 
						|
	    if (option->opt_val != NULL)
 | 
						|
		rotate = strcasecmp(option->opt_val, "CW") == 0 ? 1 :
 | 
						|
			 strcasecmp(option->opt_val, "CCW") == 0 ? -1 : 0;
 | 
						|
	    XtFree(option->opt_val);
 | 
						|
	    option->opt_val = XtNewString(rotate > 0 ? "CW" : "CCW");
 | 
						|
	    computer.screens[i]->rotate = rotate;
 | 
						|
	}
 | 
						|
	else
 | 
						|
	    computer.screens[i]->rotate = 0;
 | 
						|
	UpdateScreenUI();
 | 
						|
	AdjustScreenUI();
 | 
						|
	SetTip((xf86cfgDevice*)computer.screens[i]);
 | 
						|
    }
 | 
						|
    else {
 | 
						|
	if (i >= computer.num_devices)
 | 
						|
	    SetTip(&cpu_device);
 | 
						|
	else
 | 
						|
	    SetTip(computer.devices[i]);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
EnableDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    int i;
 | 
						|
 | 
						|
    if (config_mode == CONFIG_SCREEN) {
 | 
						|
	for (i = 0; i < computer.num_screens; i++)
 | 
						|
	    if (computer.screens[i]->widget == config) {
 | 
						|
		computer.screens[i]->state = USED;
 | 
						|
		computer.screens[i]->card->state = USED;
 | 
						|
		ScreenSetup(False);
 | 
						|
		return;
 | 
						|
	    }
 | 
						|
    }
 | 
						|
 | 
						|
    for (i = 0; i < computer.num_devices; i++)
 | 
						|
	if (computer.devices[i]->widget == config) {
 | 
						|
	    if (computer.devices[i]->state == USED)
 | 
						|
		return;
 | 
						|
	    computer.devices[i]->state = USED;
 | 
						|
	    DrawCables();
 | 
						|
	    break;
 | 
						|
	}
 | 
						|
    if (i >= computer.num_devices || computer.layout == NULL)
 | 
						|
	return;
 | 
						|
    switch (computer.devices[i]->type) {
 | 
						|
	case MOUSE:
 | 
						|
	case KEYBOARD: {
 | 
						|
	    int nmouses = 0, nkeyboards = 0;
 | 
						|
	    XF86ConfInputPtr input = (XF86ConfInputPtr)
 | 
						|
		(computer.devices[i]->config);
 | 
						|
	    XF86ConfInputrefPtr nex, iref = computer.layout->lay_input_lst;
 | 
						|
	    XF86OptionPtr option;
 | 
						|
 | 
						|
	    nex = iref;
 | 
						|
	    while (nex != NULL) {
 | 
						|
		if (strcasecmp(nex->iref_inputdev->inp_driver, "mouse") == 0)
 | 
						|
		    ++nmouses;
 | 
						|
		else if (IS_KBDDRIV(nex->iref_inputdev->inp_driver))
 | 
						|
		    ++nkeyboards;
 | 
						|
		iref = nex;
 | 
						|
		nex = (XF86ConfInputrefPtr)(nex->list.next);
 | 
						|
	    }
 | 
						|
	    nex = (XF86ConfInputrefPtr)XtCalloc(1, sizeof(XF86ConfInputrefRec));
 | 
						|
	    nex->list.next = NULL;
 | 
						|
	    nex->iref_inputdev = input;
 | 
						|
	    nex->iref_inputdev_str = XtNewString(input->inp_identifier);
 | 
						|
	    if (nmouses == 0 && computer.devices[i]->type == MOUSE) 
 | 
						|
		option = xf86newOption(XtNewString("CorePointer"), NULL);
 | 
						|
	    else if (nkeyboards == 0 && computer.devices[i]->type == KEYBOARD)
 | 
						|
		option = xf86newOption(XtNewString("CoreKeyboard"), NULL);
 | 
						|
	    else
 | 
						|
		option = xf86newOption(XtNewString("SendCoreEvents"), NULL);
 | 
						|
	    nex->iref_option_lst = option;
 | 
						|
	    computer.layout->lay_input_lst =
 | 
						|
		xf86addInputref(computer.layout->lay_input_lst, nex);
 | 
						|
	}   break;
 | 
						|
	case CARD:
 | 
						|
	    for (i = 0; i < computer.num_screens; i++) {
 | 
						|
		if (computer.screens[i]->card->widget == config &&
 | 
						|
		    computer.screens[i]->state != USED) {
 | 
						|
		    XF86ConfAdjacencyPtr adj;
 | 
						|
 | 
						|
		    adj = (XF86ConfAdjacencyPtr)
 | 
						|
			XtCalloc(1, sizeof(XF86ConfAdjacencyRec));
 | 
						|
		    adj->adj_screen = computer.screens[i]->screen;
 | 
						|
		    adj->adj_screen_str = XtNewString(computer.screens[i]->
 | 
						|
			screen->scrn_identifier);
 | 
						|
		    computer.layout->lay_adjacency_lst = (XF86ConfAdjacencyPtr)
 | 
						|
			xf86addListItem((GenericListPtr)computer.layout->
 | 
						|
				    lay_adjacency_lst, (GenericListPtr)adj);
 | 
						|
		    computer.screens[i]->state = USED;
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	    break;
 | 
						|
	case MONITOR:
 | 
						|
	    break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
DisableDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    int i;
 | 
						|
 | 
						|
    if (config_mode == CONFIG_SCREEN) {
 | 
						|
	for (i = 0; i < computer.num_screens; i++)
 | 
						|
	    if (computer.screens[i]->widget == config) {
 | 
						|
		computer.screens[i]->state = UNUSED;
 | 
						|
		computer.screens[i]->card->state = UNUSED;
 | 
						|
		ScreenSetup(False);
 | 
						|
		return;
 | 
						|
	    }
 | 
						|
    }
 | 
						|
 | 
						|
    for (i = 0; i < computer.num_devices; i++)
 | 
						|
	if (computer.devices[i]->widget == config) {
 | 
						|
	    if (computer.devices[i]->state == UNUSED)
 | 
						|
		return;
 | 
						|
	    computer.devices[i]->state = UNUSED;
 | 
						|
	    DrawCables();
 | 
						|
	    break;
 | 
						|
	}
 | 
						|
    if (i >= computer.num_devices || computer.layout == NULL)
 | 
						|
	return;
 | 
						|
    switch (computer.devices[i]->type) {
 | 
						|
	case MOUSE:
 | 
						|
	case KEYBOARD:
 | 
						|
	    xf86removeInputRef(computer.layout,
 | 
						|
		(XF86ConfInputPtr)(computer.devices[i]->config));
 | 
						|
	    break;
 | 
						|
	case CARD: {
 | 
						|
	    XF86ConfAdjacencyPtr adj;
 | 
						|
	    int j;
 | 
						|
 | 
						|
	    if (computer.layout == NULL)
 | 
						|
		break;
 | 
						|
	    for (j = 0; j < computer.num_screens; j++)
 | 
						|
		if (computer.screens[j]->card->widget == config) {
 | 
						|
		    adj = computer.layout->lay_adjacency_lst;
 | 
						|
		    while (adj != NULL) {
 | 
						|
			if (adj->adj_screen == computer.screens[j]->screen) {
 | 
						|
			    xf86removeAdjacency(computer.layout, adj);
 | 
						|
			    break;
 | 
						|
			}
 | 
						|
			adj = (XF86ConfAdjacencyPtr)(adj->list.next);
 | 
						|
		    }
 | 
						|
		    computer.screens[j]->state = UNUSED;
 | 
						|
		    break;
 | 
						|
		}
 | 
						|
	}   break;
 | 
						|
	case MONITOR:
 | 
						|
	    break;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/* ARGSUSED */
 | 
						|
void
 | 
						|
RemoveDeviceCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    int i, j;
 | 
						|
 | 
						|
    for (i = 0; i < computer.num_screens; i++)
 | 
						|
	if (computer.screens[i]->widget == config) {
 | 
						|
	    RemoveScreen(computer.screens[i]->monitor,
 | 
						|
			 computer.screens[i]->card);
 | 
						|
	    ScreenSetup(False);
 | 
						|
	    return;
 | 
						|
	}
 | 
						|
 | 
						|
    for (i = 0; i < computer.num_devices; i++) {
 | 
						|
	if (computer.devices[i]->widget == config) {
 | 
						|
	    switch (computer.devices[i]->type) {
 | 
						|
		case MOUSE:
 | 
						|
		case KEYBOARD:
 | 
						|
		    xf86removeInput(XF86Config,
 | 
						|
			(XF86ConfInputPtr)(computer.devices[i]->config));
 | 
						|
		    break;
 | 
						|
		case CARD:
 | 
						|
		case MONITOR:
 | 
						|
		    break;
 | 
						|
	    }
 | 
						|
 | 
						|
	    if (computer.devices[i]->type == CARD) {
 | 
						|
		for (j = 0; j < computer.num_screens; j++)
 | 
						|
		    if (computer.screens[j]->card == computer.devices[i]) {
 | 
						|
			RemoveScreen(computer.screens[j]->monitor,
 | 
						|
				     computer.devices[i]);
 | 
						|
			--j;
 | 
						|
		    }
 | 
						|
		if (computer.devices[i]->refcount <= 0)
 | 
						|
		    xf86removeDevice(XF86Config,
 | 
						|
			(XF86ConfDevicePtr)(computer.devices[i]->config));
 | 
						|
	    }
 | 
						|
	    else if (computer.devices[i]->type == MONITOR) {
 | 
						|
		for (j = 0; j < computer.num_screens; j++)
 | 
						|
		    if (computer.screens[j]->monitor == computer.devices[i]) {
 | 
						|
			RemoveScreen(computer.devices[i],
 | 
						|
				     computer.screens[j]->card);
 | 
						|
			--j;
 | 
						|
		    }
 | 
						|
		if (computer.devices[i]->refcount <= 0)
 | 
						|
		    xf86removeMonitor(XF86Config,
 | 
						|
			(XF86ConfMonitorPtr)(computer.devices[i]->config));
 | 
						|
	    }
 | 
						|
 | 
						|
	    if (computer.devices[i]->refcount <= 0) {
 | 
						|
		int type = computer.devices[i]->type;
 | 
						|
 | 
						|
		XtDestroyWidget(computer.devices[i]->widget);
 | 
						|
		XtFree((XtPointer)computer.devices[i]);
 | 
						|
		if (--computer.num_devices > i)
 | 
						|
		    memmove(&computer.devices[i], &computer.devices[i + 1],
 | 
						|
			    (computer.num_devices - i) * sizeof(xf86cfgDevice*));
 | 
						|
 | 
						|
		DrawCables();
 | 
						|
		UpdateMenuDeviceList(type);
 | 
						|
	    }
 | 
						|
 | 
						|
	    break;
 | 
						|
	}
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
UpdateMenuDeviceList(int type)
 | 
						|
{
 | 
						|
    Widget sme = NULL, menu = NULL;
 | 
						|
    int i, count;
 | 
						|
    static char *mouseM = "mouseM", *keyboardM = "keyboardM",
 | 
						|
		*cardM = "cardM", *monitorM = "monitorM";
 | 
						|
 | 
						|
    for (i = count = 0; i < computer.num_devices; i++)
 | 
						|
	if (computer.devices[i]->type == type)
 | 
						|
	    ++count;
 | 
						|
 | 
						|
    switch (type) {
 | 
						|
	case MOUSE:
 | 
						|
	    sme = mouseSme;
 | 
						|
	    menu = mouseMenu;
 | 
						|
	    break;
 | 
						|
	case KEYBOARD:
 | 
						|
	    sme = keyboardSme;
 | 
						|
	    menu = keyboardMenu;
 | 
						|
	    break;
 | 
						|
	case CARD:
 | 
						|
	    sme = cardSme;
 | 
						|
	    menu = cardMenu;
 | 
						|
	    break;
 | 
						|
	case MONITOR:
 | 
						|
	    sme = monitorSme;
 | 
						|
	    menu = monitorMenu;
 | 
						|
	    break;
 | 
						|
    }
 | 
						|
 | 
						|
    if (menu)
 | 
						|
	for (i = ((CompositeWidget)menu)->composite.num_children - 1; i >= 0; i--)
 | 
						|
	    XtDestroyWidget(((CompositeWidget)menu)->composite.children[i]);
 | 
						|
 | 
						|
    if (count < 2) {
 | 
						|
	XtVaSetValues(sme, XtNmenuName, NULL, XtNleftBitmap, None, NULL);
 | 
						|
	return;
 | 
						|
    }
 | 
						|
 | 
						|
    switch (type) {
 | 
						|
	case MOUSE:
 | 
						|
	    if (mouseMenu == NULL)
 | 
						|
		menu = mouseMenu =
 | 
						|
		    XtCreatePopupShell(mouseM, simpleMenuWidgetClass,
 | 
						|
				       XtParent(mouseSme), NULL, 0);
 | 
						|
	    XtVaSetValues(mouseSme, XtNmenuName, mouseM,
 | 
						|
			  XtNleftBitmap, menuPixmap, NULL);
 | 
						|
	    break;
 | 
						|
	case KEYBOARD:
 | 
						|
	    if (keyboardMenu == NULL)
 | 
						|
		menu = keyboardMenu =
 | 
						|
		    XtCreatePopupShell(keyboardM, simpleMenuWidgetClass,
 | 
						|
				       XtParent(keyboardSme), NULL, 0);
 | 
						|
	    XtVaSetValues(keyboardSme, XtNmenuName, keyboardM,
 | 
						|
			  XtNleftBitmap, menuPixmap, NULL);
 | 
						|
	    break;
 | 
						|
	case CARD:
 | 
						|
	    if (cardMenu == NULL)
 | 
						|
		menu = cardMenu =
 | 
						|
		    XtCreatePopupShell(cardM, simpleMenuWidgetClass,
 | 
						|
				       XtParent(cardSme), NULL, 0);
 | 
						|
	    XtVaSetValues(cardSme, XtNmenuName, cardM,
 | 
						|
			  XtNleftBitmap, menuPixmap, NULL);
 | 
						|
	    break;
 | 
						|
	case MONITOR:
 | 
						|
	    if (monitorMenu == NULL)
 | 
						|
		menu = monitorMenu =
 | 
						|
		    XtCreatePopupShell(monitorM, simpleMenuWidgetClass,
 | 
						|
				       XtParent(monitorSme), NULL, 0);
 | 
						|
	    XtVaSetValues(monitorSme, XtNmenuName, monitorM,
 | 
						|
			  XtNleftBitmap, menuPixmap, NULL);
 | 
						|
	    break;
 | 
						|
    }
 | 
						|
 | 
						|
    for (i = 0; i < computer.num_devices; i++)
 | 
						|
	if (computer.devices[i]->type == type) {
 | 
						|
	    char *label = NULL;
 | 
						|
 | 
						|
	    if (computer.devices[i]->config) {
 | 
						|
		switch (type) {
 | 
						|
		    case MOUSE:
 | 
						|
		    case KEYBOARD:
 | 
						|
			label = ((XF86ConfInputPtr)computer.devices[i]->config)
 | 
						|
			    ->inp_identifier;
 | 
						|
			break;
 | 
						|
		    case CARD:
 | 
						|
			label = ((XF86ConfDevicePtr)computer.devices[i]->config)
 | 
						|
			    ->dev_identifier;
 | 
						|
			break;
 | 
						|
		    case MONITOR:
 | 
						|
			label = ((XF86ConfMonitorPtr)computer.devices[i]->config)
 | 
						|
			    ->mon_identifier;
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	    }
 | 
						|
	    else {
 | 
						|
		switch (type) {
 | 
						|
		    case MOUSE:
 | 
						|
			label = "newMouse";
 | 
						|
			break;
 | 
						|
		    case KEYBOARD:
 | 
						|
			label = "newKeyboard";
 | 
						|
			break;
 | 
						|
		    case CARD:
 | 
						|
			label = "newCard";
 | 
						|
			break;
 | 
						|
		    case MONITOR:
 | 
						|
			label = "newMonitor";
 | 
						|
			break;
 | 
						|
		}
 | 
						|
	    }
 | 
						|
 | 
						|
	    sme = XtCreateManagedWidget(label, smeBSBObjectClass, menu, NULL, 0);
 | 
						|
	    XtAddCallback(sme, XtNcallback, SmeConfigureDeviceCallback,
 | 
						|
			  computer.devices[i]->config ?
 | 
						|
			  computer.devices[i]->config :
 | 
						|
			  (XtPointer) (-((long)type + 100)));
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
SelectDeviceAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
 | 
						|
{
 | 
						|
    device = w;
 | 
						|
    xpos = event->xbutton.x_root;
 | 
						|
    ypos = event->xbutton.y_root;
 | 
						|
    XDefineCursor(XtDisplay(device), XtWindow(device), no_cursor);
 | 
						|
 | 
						|
    if (config_mode == CONFIG_SCREEN) {
 | 
						|
	sxpos = device->core.x;
 | 
						|
	sypos = device->core.y;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
MoveDeviceAction(Widget w, XEvent *event, String *params, Cardinal *num_params)
 | 
						|
{
 | 
						|
    int dx, dy, x, y, oldx, oldy;
 | 
						|
 | 
						|
    if (device == NULL || device != w)
 | 
						|
	return;
 | 
						|
 | 
						|
    dx = event->xbutton.x_root - xpos;
 | 
						|
    dy = event->xbutton.y_root - ypos;
 | 
						|
 | 
						|
    oldx = device->core.x;
 | 
						|
    oldy = device->core.y;
 | 
						|
    x = device->core.x + dx;
 | 
						|
    y = device->core.y + dy;
 | 
						|
 | 
						|
    if (x < 0)
 | 
						|
	x = 0;
 | 
						|
    else if (x + device->core.width > XtParent(device)->core.width)
 | 
						|
	x = XtParent(device)->core.width - device->core.width;
 | 
						|
    if (y < 0)
 | 
						|
	y = 0;
 | 
						|
    else if (y + device->core.height > XtParent(device)->core.height)
 | 
						|
	y = XtParent(device)->core.height - device->core.height;
 | 
						|
 | 
						|
    dx = x - oldx;
 | 
						|
    dy = y - oldy;
 | 
						|
 | 
						|
    XRaiseWindow(XtDisplay(device), XtWindow(device));
 | 
						|
    XtMoveWidget(device, x, y);
 | 
						|
 | 
						|
    xpos += dx;
 | 
						|
    ypos += dy;
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
UnselectDeviceAction(Widget w, XEvent *ev, String *params, Cardinal *num_params)
 | 
						|
{
 | 
						|
    if (device != NULL) {
 | 
						|
	XUndefineCursor(XtDisplay(device), XtWindow(device));
 | 
						|
 | 
						|
	if (config_mode == CONFIG_SCREEN)
 | 
						|
	    ScreenSetup(False);
 | 
						|
	device = NULL;
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
DevicePopupMenu(Widget w, XEvent *event, String *params, Cardinal *num_params)
 | 
						|
{
 | 
						|
    static Widget configure, options, enable, disable, remove;
 | 
						|
    static int first = 1;
 | 
						|
    int i;
 | 
						|
    xf86cfgDevice *dev;
 | 
						|
 | 
						|
    if (first) {
 | 
						|
	first = 0;
 | 
						|
 | 
						|
	popup = XtCreatePopupShell("popup", simpleMenuWidgetClass,
 | 
						|
				   toplevel, NULL, 0);
 | 
						|
	configure = XtCreateManagedWidget("configure", smeBSBObjectClass,
 | 
						|
					  popup, NULL, 0);
 | 
						|
	XtAddCallback(configure, XtNcallback, ConfigureDeviceCallback, NULL);
 | 
						|
	options = XtCreateManagedWidget("options", smeBSBObjectClass,
 | 
						|
					popup, NULL, 0);
 | 
						|
	XtAddCallback(options, XtNcallback, OptionsCallback, NULL);
 | 
						|
	XtCreateManagedWidget("line", smeLineObjectClass,
 | 
						|
			      popup, NULL, 0);
 | 
						|
	enable = XtCreateManagedWidget("enable", smeBSBObjectClass,
 | 
						|
				       popup, NULL, 0);
 | 
						|
	XtAddCallback(enable, XtNcallback, EnableDeviceCallback, NULL);
 | 
						|
	disable = XtCreateManagedWidget("disable", smeBSBObjectClass,
 | 
						|
					popup, NULL, 0);
 | 
						|
	XtAddCallback(disable, XtNcallback, DisableDeviceCallback, NULL);
 | 
						|
	XtCreateManagedWidget("line", smeLineObjectClass,
 | 
						|
			      popup, NULL, 0);
 | 
						|
	remove = XtCreateManagedWidget("remove", smeBSBObjectClass,
 | 
						|
				       popup, NULL, 0);
 | 
						|
	XtAddCallback(remove, XtNcallback, RemoveDeviceCallback, NULL);
 | 
						|
 | 
						|
	XtRealizeWidget(popup);
 | 
						|
    }
 | 
						|
 | 
						|
    dev = NULL;
 | 
						|
    if (config_mode == CONFIG_LAYOUT) {
 | 
						|
	for (i = 0; i < computer.num_devices; i++)
 | 
						|
	    if (computer.devices[i]->widget == w) {
 | 
						|
		dev = computer.devices[i];
 | 
						|
		break;
 | 
						|
	    }
 | 
						|
	if (i >= computer.num_devices && strcmp(XtName(w), "cpu"))
 | 
						|
	    return;
 | 
						|
	if (dev == NULL)
 | 
						|
	    dev = &cpu_device;
 | 
						|
    }
 | 
						|
    else if (config_mode == CONFIG_SCREEN) {
 | 
						|
	for (i = 0; i < computer.num_screens; i++)
 | 
						|
	    if (computer.screens[i]->widget == w) {
 | 
						|
		dev = (xf86cfgDevice*)computer.screens[i];
 | 
						|
		break;
 | 
						|
	    }
 | 
						|
    }
 | 
						|
    if (dev == NULL)
 | 
						|
	return;
 | 
						|
 | 
						|
    config = w;
 | 
						|
 | 
						|
    if (dev->type != SERVER) {
 | 
						|
	XtSetSensitive(configure, True);
 | 
						|
	XtSetSensitive(remove, True);
 | 
						|
	XtSetSensitive(options, dev->config != NULL);
 | 
						|
	if (computer.layout == NULL || dev->config == NULL ||
 | 
						|
	    dev->type == MONITOR) {
 | 
						|
	    XtSetSensitive(enable, False);
 | 
						|
	    XtSetSensitive(disable, False);
 | 
						|
	}
 | 
						|
	else if (dev->state == USED) {
 | 
						|
	    XtSetSensitive(enable, False);
 | 
						|
	    XtSetSensitive(disable, True);
 | 
						|
	}
 | 
						|
	else {
 | 
						|
	    XtSetSensitive(enable, True);
 | 
						|
	    XtSetSensitive(disable, False);
 | 
						|
	}
 | 
						|
    }
 | 
						|
    else {
 | 
						|
	XtSetSensitive(configure, False);
 | 
						|
	XtSetSensitive(options, True);
 | 
						|
	XtSetSensitive(enable, False);
 | 
						|
	XtSetSensitive(disable, False);
 | 
						|
	XtSetSensitive(remove, False);
 | 
						|
    }
 | 
						|
 | 
						|
    XtMoveWidget(popup, event->xbutton.x_root, event->xbutton.y_root);
 | 
						|
    XtPopup(popup, XtGrabNone);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
DevicePopdownMenu(Widget w, XEvent *event, String *params, Cardinal *num_params)
 | 
						|
{
 | 
						|
    if (popup && XtIsRealized(popup))
 | 
						|
	XtPopdown(popup);
 | 
						|
}
 | 
						|
 | 
						|
void RenameLayoutAction(Widget w, XEvent *event,
 | 
						|
			String *params, Cardinal *num_params)
 | 
						|
{
 | 
						|
    XF86ConfLayoutPtr lay = XF86Config->conf_layout_lst;
 | 
						|
    Arg args[1];
 | 
						|
    char *name;
 | 
						|
 | 
						|
    XtSetArg(args[0], XtNstring, &name);
 | 
						|
    XtGetValues(layout, args, 1);
 | 
						|
 | 
						|
    if (computer.layout == NULL || (computer.layout &&
 | 
						|
	strcasecmp(name, computer.layout->lay_identifier)) == 0)
 | 
						|
	return;
 | 
						|
 | 
						|
    if (name == NULL && *name == '\0') {
 | 
						|
	/* tell user about error */
 | 
						|
	return;
 | 
						|
    }
 | 
						|
 | 
						|
    while (lay) {
 | 
						|
	if (strcasecmp(name, lay->lay_identifier) == 0)
 | 
						|
	    /* tell user about error */
 | 
						|
	    return;
 | 
						|
	lay = (XF86ConfLayoutPtr)(lay->list.next);
 | 
						|
    }
 | 
						|
 | 
						|
    XtSetArg(args[0], XtNlabel, name);
 | 
						|
    XtSetValues(layoutsme, args, 1);
 | 
						|
    xf86renameLayout(XF86Config, computer.layout, name);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
static void
 | 
						|
ComputerEventHandler(Widget w, XtPointer closure,
 | 
						|
		     XEvent *event, Boolean *continue_to_dispatch)
 | 
						|
{
 | 
						|
    if (event->xexpose.count > 1)
 | 
						|
	return;
 | 
						|
 | 
						|
    if (config_mode == CONFIG_LAYOUT)
 | 
						|
	DrawCables();
 | 
						|
}
 | 
						|
 | 
						|
void
 | 
						|
DrawCables(void)
 | 
						|
{
 | 
						|
    Display *display;
 | 
						|
    Window window;
 | 
						|
    int ox, oy, i;
 | 
						|
    xf86cfgScreen **scr = computer.screens;
 | 
						|
 | 
						|
    if (config_mode != CONFIG_LAYOUT)
 | 
						|
	return;
 | 
						|
 | 
						|
    ox = computer.cpu->core.x + (computer.cpu->core.width >> 1);
 | 
						|
    oy = computer.cpu->core.y + (computer.cpu->core.height >> 1);
 | 
						|
 | 
						|
    display = XtDisplay(work);
 | 
						|
    window = XtWindow(work);
 | 
						|
    XClearWindow(display, window);
 | 
						|
 | 
						|
    for (i = 0; i < computer.num_devices; i++) {
 | 
						|
	if (computer.devices[i]->state == USED &&
 | 
						|
	    computer.devices[i]->type != MONITOR)
 | 
						|
	    DrawCable(display, window, ox, oy,
 | 
						|
		      computer.devices[i]->widget->core.x +
 | 
						|
			    (computer.devices[i]->widget->core.width>>1),
 | 
						|
		      computer.devices[i]->widget->core.y +
 | 
						|
			    (computer.devices[i]->widget->core.height>>1));
 | 
						|
 | 
						|
    }
 | 
						|
    for (i = 0; i < computer.num_screens; i++) {
 | 
						|
	if (scr[i]->monitor != NULL)
 | 
						|
	    DrawCable(display, window,
 | 
						|
		      scr[i]->card->widget->core.x +
 | 
						|
			    (scr[i]->card->widget->core.width>>1),
 | 
						|
		      scr[i]->card->widget->core.y +
 | 
						|
			    (scr[i]->card->widget->core.height>>1),
 | 
						|
		      scr[i]->monitor->widget->core.x +
 | 
						|
			    (scr[i]->monitor->widget->core.width>>1),
 | 
						|
		      scr[i]->monitor->widget->core.y +
 | 
						|
			    (scr[i]->monitor->widget->core.height>>1));
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
DrawCable(Display *display, Window window, int o_x, int o_y, int d_x, int d_y)
 | 
						|
{
 | 
						|
    XDrawLine(display, window, cablegcshadow, o_x, o_y, d_x, d_y);
 | 
						|
    XDrawLine(display, window, cablegc, o_x, o_y, d_x, d_y);
 | 
						|
}
 | 
						|
 | 
						|
/*ARGSUSED*/
 | 
						|
void
 | 
						|
SetConfigModeCallback(Widget w, XtPointer user_data, XtPointer call_data)
 | 
						|
{
 | 
						|
    int i, mode = (long)user_data;
 | 
						|
    Arg args[3];
 | 
						|
    char *ptr;
 | 
						|
    static Dimension height;
 | 
						|
 | 
						|
    if (mode == config_mode)
 | 
						|
	return;
 | 
						|
    XtSetArg(args[0], XtNlabel, &ptr);
 | 
						|
    XtGetValues(w, args, 1);
 | 
						|
    XtSetArg(args[0], XtNlabel, ptr);
 | 
						|
    XtSetValues(topMenu, args, 1);
 | 
						|
 | 
						|
    if (config_mode == CONFIG_LAYOUT) {
 | 
						|
	XtSetArg(args[0], XtNheight, &height);
 | 
						|
	XtGetValues(commands, args, 1);
 | 
						|
	for (i = 0; i < computer.num_devices; i++)
 | 
						|
	    XtUnmapWidget(computer.devices[i]->widget);
 | 
						|
	XtUnmapWidget(commands);
 | 
						|
	XtUnmapWidget(computer.cpu);
 | 
						|
	XtSetSensitive(commands, False);
 | 
						|
	XtSetArg(args[0], XtNheight, 1);
 | 
						|
	XtSetArg(args[1], XtNmin, 1);
 | 
						|
	XtSetArg(args[2], XtNmax, 1);
 | 
						|
	XtSetValues(commands, args, 3);
 | 
						|
    }
 | 
						|
    else if (config_mode == CONFIG_SCREEN) {
 | 
						|
	for (i = 0; i < computer.num_screens; i++)
 | 
						|
	    XtUnmapWidget(computer.screens[i]->widget);
 | 
						|
    }
 | 
						|
    else if (config_mode == CONFIG_MODELINE) {
 | 
						|
	VideoModeConfigureEnd();
 | 
						|
	XtSetSensitive(layout, True);
 | 
						|
	XtSetSensitive(layoutm, True);
 | 
						|
    }
 | 
						|
    else if (config_mode == CONFIG_ACCESSX) {
 | 
						|
	AccessXConfigureEnd();
 | 
						|
	XtSetSensitive(layout, True);
 | 
						|
	XtSetSensitive(layoutm, True);
 | 
						|
    }
 | 
						|
 | 
						|
    config_mode = mode;
 | 
						|
    XClearWindow(XtDisplay(work), XtWindow(work));
 | 
						|
    if (mode == CONFIG_LAYOUT) {
 | 
						|
	for (i = 0; i < computer.num_devices; i++)
 | 
						|
	    XtMapWidget(computer.devices[i]->widget);
 | 
						|
	XtSetArg(args[0], XtNheight, height);
 | 
						|
	XtSetArg(args[1], XtNmin, height);
 | 
						|
	XtSetArg(args[2], XtNmax, height);
 | 
						|
	XtSetValues(commands, args, 3);
 | 
						|
	XtMapWidget(commands);
 | 
						|
	XtMapWidget(computer.cpu);
 | 
						|
	XtSetSensitive(commands, True);
 | 
						|
	DrawCables();
 | 
						|
    }
 | 
						|
    else if (mode == CONFIG_SCREEN) {
 | 
						|
	for (i = 0; i < computer.num_screens; i++)
 | 
						|
	    XtMapWidget(computer.screens[i]->widget);
 | 
						|
	ScreenSetup(True);
 | 
						|
    }
 | 
						|
    else if (mode == CONFIG_MODELINE) {
 | 
						|
	VideoModeConfigureStart();
 | 
						|
	XtSetSensitive(layout, False);
 | 
						|
	XtSetSensitive(layoutm, False);
 | 
						|
    }
 | 
						|
    else if (mode == CONFIG_ACCESSX) {
 | 
						|
	AccessXConfigureStart();
 | 
						|
	XtSetSensitive(layout, False);
 | 
						|
	XtSetSensitive(layoutm, False);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void
 | 
						|
ScreenSetup(Bool check)
 | 
						|
{
 | 
						|
    if (check) {
 | 
						|
	int i;
 | 
						|
 | 
						|
	for (i = 0; i < computer.num_layouts; i++)
 | 
						|
	    if (computer.layouts[i]->layout == computer.layout)
 | 
						|
		break;
 | 
						|
 | 
						|
	/* Just to put the screens in the correct positions */
 | 
						|
	if (i >= computer.num_layouts)
 | 
						|
	    AdjustScreenUI();
 | 
						|
    }
 | 
						|
 | 
						|
    UpdateScreenUI();
 | 
						|
    AdjustScreenUI();
 | 
						|
}
 |