2284 lines
64 KiB
C
2284 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) || \
|
|
(strcasecmp((S), "keyboard") == 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"
|
|
" -rgbpath <rgb-path> Where the rgb.txt file is located.\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];
|
|
} else if (strcmp(argv[i], "-rgbpath") == 0) {
|
|
if (i + 1 < argc)
|
|
XF86RGB_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();
|
|
}
|