434 lines
12 KiB
C
434 lines
12 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 "xf86config.h"
|
||
|
#include "mouse-cfg.h"
|
||
|
#include "cards.h"
|
||
|
#include "card-cfg.h"
|
||
|
#include <X11/Xaw/AsciiText.h>
|
||
|
#include <X11/Xaw/Form.h>
|
||
|
#include <X11/Xaw/Label.h>
|
||
|
#include <X11/Xaw/List.h>
|
||
|
#include <X11/Xaw/MenuButton.h>
|
||
|
#include <X11/Xaw/SmeBSB.h>
|
||
|
#include <X11/Xaw/SimpleMenu.h>
|
||
|
#include <X11/Xaw/Viewport.h>
|
||
|
#ifdef USE_MODULES
|
||
|
#include "loader.h"
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* Prototypes
|
||
|
*/
|
||
|
static Bool CardConfigCheck(void);
|
||
|
static void CardModelCallback(Widget, XtPointer, XtPointer);
|
||
|
#ifdef USE_MODULES
|
||
|
static void DriverCallback(Widget, XtPointer, XtPointer);
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* Initialization
|
||
|
*/
|
||
|
static CardsEntry *card_entry;
|
||
|
static XF86ConfDevicePtr current_device;
|
||
|
static Widget filter, list, driver, busid;
|
||
|
static char **cards = NULL;
|
||
|
static int ncards;
|
||
|
#ifdef USE_MODULES
|
||
|
static char *driver_str;
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* Implementation
|
||
|
*/
|
||
|
/*ARGSUSED*/
|
||
|
XtPointer
|
||
|
CardConfig(XtPointer config)
|
||
|
{
|
||
|
XF86ConfDevicePtr card = (XF86ConfDevicePtr)config;
|
||
|
/* XF86OptionPtr option;*/
|
||
|
char card_name[32];
|
||
|
Arg args[1];
|
||
|
char *bus, *drv_nam;
|
||
|
|
||
|
xf86info.cur_list = CARD;
|
||
|
XtSetSensitive(back, xf86info.lists[CARD].cur_function > 0);
|
||
|
XtSetSensitive(next, xf86info.lists[CARD].cur_function <
|
||
|
xf86info.lists[CARD].num_functions - 1);
|
||
|
(xf86info.lists[CARD].functions[xf86info.lists[CARD].cur_function])
|
||
|
(&xf86info);
|
||
|
|
||
|
card_entry = NULL;
|
||
|
current_device = card;
|
||
|
XawListUnhighlight(list);
|
||
|
XtSetArg(args[0], XtNstring, "");
|
||
|
XtSetValues(filter, args, 1);
|
||
|
|
||
|
if (card != NULL) {
|
||
|
if (card->dev_card != NULL) {
|
||
|
int i;
|
||
|
|
||
|
for (i = 0; i < ncards; i++) {
|
||
|
if (strcasecmp(cards[i], card->dev_card) == 0) {
|
||
|
card_entry = LookupCard(cards[i]);
|
||
|
XawListHighlight(list, i);
|
||
|
XtSetArg(args[0], XtNstring, cards[i]);
|
||
|
XtSetValues(filter, args, 1);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
XtSetArg(args[0], XtNstring, card->dev_identifier);
|
||
|
XtSetValues(ident_widget, args, 1);
|
||
|
XtSetArg(args[0], XtNstring, card->dev_busid);
|
||
|
XtSetValues(busid, args, 1);
|
||
|
#ifdef USE_MODULES
|
||
|
if (!nomodules)
|
||
|
XtSetArg(args[0], XtNlabel, driver_str = XtNewString(card->dev_driver));
|
||
|
else
|
||
|
#endif
|
||
|
XtSetArg(args[0], XtNstring, card->dev_driver);
|
||
|
XtSetValues(driver, args, 1);
|
||
|
}
|
||
|
else {
|
||
|
XF86ConfDevicePtr device = XF86Config->conf_device_lst;
|
||
|
int ndevices = 0;
|
||
|
|
||
|
while (device != NULL) {
|
||
|
++ndevices;
|
||
|
device = (XF86ConfDevicePtr)(device->list.next);
|
||
|
}
|
||
|
do {
|
||
|
XmuSnprintf(card_name, sizeof(card_name), "Card%d", ndevices);
|
||
|
++ndevices;
|
||
|
} while (xf86findDevice(card_name,
|
||
|
XF86Config->conf_device_lst));
|
||
|
|
||
|
XtSetArg(args[0], XtNstring, card_name);
|
||
|
XtSetValues(ident_widget, args, 1);
|
||
|
XtSetArg(args[0], XtNstring, "");
|
||
|
XtSetValues(busid, args, 1);
|
||
|
#ifdef USE_MODULES
|
||
|
if (!nomodules)
|
||
|
XtSetArg(args[0], XtNlabel, driver_str = XtNewString("vga"));
|
||
|
else
|
||
|
#endif
|
||
|
XtSetArg(args[0], XtNstring, "vga");
|
||
|
XtSetValues(driver, args, 1);
|
||
|
}
|
||
|
|
||
|
if (ConfigLoop(CardConfigCheck) == True) {
|
||
|
if (card_entry != NULL && card_entry->driver == NULL) {
|
||
|
fprintf(stderr, "No driver field in Cards database.\n"
|
||
|
"Please make sure you have the correct files installed.\n");
|
||
|
exit(1);
|
||
|
}
|
||
|
if (card == NULL) {
|
||
|
card = (XF86ConfDevicePtr)XtCalloc(1, sizeof(XF86ConfDeviceRec));
|
||
|
card->dev_identifier = XtNewString(ident_string);
|
||
|
if (card_entry) {
|
||
|
card->dev_driver = XtNewString(card_entry->driver);
|
||
|
card->dev_card = XtNewString(card_entry->name);
|
||
|
if (card_entry->chipset)
|
||
|
card->dev_chipset = XtNewString(card_entry->chipset);
|
||
|
if (card_entry->ramdac)
|
||
|
card->dev_ramdac = XtNewString(card_entry->ramdac);
|
||
|
if (card_entry->clockchip)
|
||
|
card->dev_clockchip = XtNewString(card_entry->clockchip);
|
||
|
}
|
||
|
/* else will fallback to "vga" */
|
||
|
}
|
||
|
else if (card_entry != NULL) {
|
||
|
XtFree(card->dev_driver);
|
||
|
card->dev_driver = XtNewString(card_entry->driver);
|
||
|
if (card_entry->chipset) {
|
||
|
XtFree(card->dev_chipset);
|
||
|
card->dev_chipset = XtNewString(card_entry->chipset);
|
||
|
}
|
||
|
if (card_entry->ramdac) {
|
||
|
XtFree(card->dev_ramdac);
|
||
|
card->dev_ramdac = XtNewString(card_entry->ramdac);
|
||
|
}
|
||
|
if (card_entry->clockchip) {
|
||
|
XtFree(card->dev_clockchip);
|
||
|
card->dev_clockchip = XtNewString(card_entry->clockchip);
|
||
|
}
|
||
|
}
|
||
|
if (strcasecmp(card->dev_identifier, ident_string))
|
||
|
xf86renameDevice(XF86Config, card, ident_string);
|
||
|
XtSetArg(args[0], XtNstring, &bus);
|
||
|
XtGetValues(busid, args, 1);
|
||
|
XtFree(card->dev_busid);
|
||
|
card->dev_busid = XtNewString(bus);
|
||
|
|
||
|
#ifdef USE_MODULES
|
||
|
if (!nomodules)
|
||
|
drv_nam = driver_str;
|
||
|
else
|
||
|
#endif
|
||
|
{
|
||
|
XtSetArg(args[0], XtNstring, &drv_nam);
|
||
|
XtGetValues(driver, args, 1);
|
||
|
}
|
||
|
|
||
|
XtFree(card->dev_driver);
|
||
|
card->dev_driver = XtNewString(drv_nam);
|
||
|
|
||
|
#ifdef USE_MODULES
|
||
|
if (!nomodules)
|
||
|
XtFree(driver_str);
|
||
|
#endif
|
||
|
|
||
|
return ((XtPointer)card);
|
||
|
}
|
||
|
#ifdef USE_MODULES
|
||
|
if (!nomodules)
|
||
|
XtFree(driver_str);
|
||
|
#endif
|
||
|
|
||
|
return (NULL);
|
||
|
}
|
||
|
|
||
|
static Bool
|
||
|
CardConfigCheck(void)
|
||
|
{
|
||
|
XF86ConfDevicePtr device = XF86Config->conf_device_lst;
|
||
|
char *drv_nam;
|
||
|
|
||
|
#ifdef USE_MODULES
|
||
|
if (!nomodules)
|
||
|
drv_nam = driver_str;
|
||
|
else
|
||
|
#endif
|
||
|
{
|
||
|
Arg args[1];
|
||
|
|
||
|
XtSetArg(args[0], XtNstring, &drv_nam);
|
||
|
XtGetValues(driver, args, 1);
|
||
|
}
|
||
|
|
||
|
if (ident_string == NULL || strlen(ident_string) == 0 ||
|
||
|
#if 0
|
||
|
/* not all available cards are in the Cards database */
|
||
|
(current_device == NULL && card_entry == NULL) ||
|
||
|
#endif
|
||
|
drv_nam == NULL || *drv_nam == '\0')
|
||
|
return (False);
|
||
|
|
||
|
while (device != NULL) {
|
||
|
if (device != current_device &&
|
||
|
strcasecmp(ident_string, device->dev_identifier) == 0)
|
||
|
return (False);
|
||
|
device = (XF86ConfDevicePtr)(device->list.next);
|
||
|
}
|
||
|
|
||
|
return (True);
|
||
|
}
|
||
|
|
||
|
static void
|
||
|
CardModelCallback(Widget w, XtPointer user_data, XtPointer call_data)
|
||
|
{
|
||
|
Arg args[1];
|
||
|
XawListReturnStruct *info = (XawListReturnStruct *)call_data;
|
||
|
char tip[4096];
|
||
|
int len;
|
||
|
|
||
|
XtSetArg(args[0], XtNstring, info->string);
|
||
|
XtSetValues(filter, args, 1);
|
||
|
card_entry = LookupCard(info->string);
|
||
|
|
||
|
if (card_entry == NULL)
|
||
|
return;
|
||
|
|
||
|
len = XmuSnprintf(tip, sizeof(tip), "Name: %s\n", card_entry->name);
|
||
|
if (card_entry->flags & F_UNSUPPORTED)
|
||
|
len += XmuSnprintf(tip + len, sizeof(tip) - len,
|
||
|
"**THIS CARD IS UNSUPPORTED**\n");
|
||
|
if (card_entry->chipset != NULL)
|
||
|
len += XmuSnprintf(tip + len, sizeof(tip) - len,
|
||
|
"Chipset: %s\n", card_entry->chipset);
|
||
|
if (card_entry->driver != NULL) {
|
||
|
#ifdef USE_MODULES
|
||
|
if (!nomodules) {
|
||
|
XtFree(driver_str);
|
||
|
driver_str = XtNewString(card_entry->driver);
|
||
|
XtVaSetValues(driver, XtNlabel, driver_str, NULL);
|
||
|
}
|
||
|
#endif
|
||
|
len += XmuSnprintf(tip + len, sizeof(tip) - len,
|
||
|
"Driver: %s\n", card_entry->driver);
|
||
|
}
|
||
|
if (card_entry->ramdac != NULL)
|
||
|
len += XmuSnprintf(tip + len, sizeof(tip),
|
||
|
"Ramdac: %s\n", card_entry->ramdac);
|
||
|
if (card_entry->clockchip != NULL)
|
||
|
len += XmuSnprintf(tip + len, sizeof(tip) - len,
|
||
|
"Clockchip: %s\n", card_entry->clockchip);
|
||
|
if (card_entry->dacspeed != NULL)
|
||
|
len += XmuSnprintf(tip + len, sizeof(tip) - len,
|
||
|
"Dacspeed: %s\n", card_entry->dacspeed);
|
||
|
if (card_entry->lines != NULL)
|
||
|
len += XmuSnprintf(tip + len, sizeof(tip) - len,
|
||
|
"\n%s\n", card_entry->lines);
|
||
|
|
||
|
#ifndef USE_MODULES
|
||
|
XtSetArg(args[0], XtNstring,
|
||
|
card_entry->driver ? card_entry->driver : "vga");
|
||
|
XtSetValues(driver, args, 1);
|
||
|
#endif
|
||
|
|
||
|
XtSetArg(args[0], XtNtip, tip);
|
||
|
XtSetValues(filter, args, 1);
|
||
|
}
|
||
|
|
||
|
/*ARGSUSED*/
|
||
|
void
|
||
|
CardFilterAction(Widget w, XEvent *ev, String *params, Cardinal *num_params)
|
||
|
{
|
||
|
char **cards, *pattern, **old_cards;
|
||
|
int ncards, old_ncards;
|
||
|
Arg args[2];
|
||
|
|
||
|
XtSetArg(args[0], XtNstring, &pattern);
|
||
|
XtGetValues(w, args, 1);
|
||
|
|
||
|
XtSetArg(args[0], XtNlist, &old_cards);
|
||
|
XtSetArg(args[1], XtNnumberStrings, &old_ncards);
|
||
|
XtGetValues(list, args, 2);
|
||
|
|
||
|
cards = FilterCardNames(pattern, &ncards);
|
||
|
|
||
|
if (ncards == 0) {
|
||
|
cards = (char**)XtMalloc(sizeof(char*));
|
||
|
cards[0] = XtNewString("");
|
||
|
ncards = 1;
|
||
|
}
|
||
|
|
||
|
XtSetArg(args[0], XtNlist, cards);
|
||
|
XtSetArg(args[1], XtNnumberStrings, ncards);
|
||
|
XtSetValues(list, args, 2);
|
||
|
|
||
|
if (old_ncards > 1 || (XtName(list) != old_cards[0])) {
|
||
|
while (--old_ncards > -1)
|
||
|
XtFree(old_cards[old_ncards]);
|
||
|
XtFree((char*)old_cards);
|
||
|
}
|
||
|
|
||
|
/* force relayout */
|
||
|
XtUnmanageChild(list);
|
||
|
XtManageChild(list);
|
||
|
}
|
||
|
|
||
|
#ifdef USE_MODULES
|
||
|
/*ARGSUSED*/
|
||
|
static void
|
||
|
DriverCallback(Widget w, XtPointer user_data, XtPointer call_data)
|
||
|
{
|
||
|
Arg args[1];
|
||
|
|
||
|
XtFree(driver_str);
|
||
|
driver_str = XtNewString(XtName(w));
|
||
|
XtSetArg(args[0], XtNlabel, driver_str);
|
||
|
XtSetValues(driver, args, 1);
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
void
|
||
|
CardModel(XF86SetupInfo *info)
|
||
|
{
|
||
|
static int first = 1;
|
||
|
static Widget model;
|
||
|
|
||
|
if (first) {
|
||
|
Widget viewport;
|
||
|
|
||
|
first = 0;
|
||
|
|
||
|
cards = GetCardNames(&ncards);
|
||
|
|
||
|
model = XtCreateWidget("cardModel", formWidgetClass,
|
||
|
configp, NULL, 0);
|
||
|
(void) XtCreateManagedWidget("label", labelWidgetClass,
|
||
|
model, NULL, 0);
|
||
|
filter = XtVaCreateManagedWidget("filter", asciiTextWidgetClass,
|
||
|
model,
|
||
|
XtNeditType, XawtextEdit,
|
||
|
NULL);
|
||
|
viewport = XtCreateManagedWidget("viewport", viewportWidgetClass,
|
||
|
model, NULL, 0);
|
||
|
list = XtVaCreateManagedWidget("list", listWidgetClass,
|
||
|
viewport,
|
||
|
XtNlist, cards,
|
||
|
XtNnumberStrings, ncards,
|
||
|
NULL);
|
||
|
XtAddCallback(list, XtNcallback, CardModelCallback,
|
||
|
(XtPointer)info);
|
||
|
XtCreateManagedWidget("driverL", labelWidgetClass, model, NULL, 0);
|
||
|
#ifdef USE_MODULES
|
||
|
if (!nomodules) {
|
||
|
driver = XtVaCreateManagedWidget("driver", menuButtonWidgetClass,
|
||
|
model,
|
||
|
XtNmenuName, "driverM",
|
||
|
NULL);
|
||
|
{
|
||
|
Widget menu, sme;
|
||
|
xf86cfgModuleOptions *opts = module_options;
|
||
|
|
||
|
menu = XtCreatePopupShell("driverM", simpleMenuWidgetClass,
|
||
|
driver, NULL, 0);
|
||
|
while (opts) {
|
||
|
if (opts->type == VideoModule) {
|
||
|
sme = XtCreateManagedWidget(opts->name, smeBSBObjectClass,
|
||
|
menu, NULL, 0);
|
||
|
XtAddCallback(sme, XtNcallback, DriverCallback, NULL);
|
||
|
}
|
||
|
opts = opts->next;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
#endif
|
||
|
driver = XtVaCreateManagedWidget("driver", asciiTextWidgetClass,
|
||
|
model,
|
||
|
XtNeditType, XawtextEdit,
|
||
|
NULL);
|
||
|
|
||
|
XtCreateManagedWidget("busidL", labelWidgetClass, model, NULL, 0);
|
||
|
busid = XtVaCreateManagedWidget("busid", asciiTextWidgetClass,
|
||
|
model,
|
||
|
XtNeditType, XawtextEdit,
|
||
|
NULL);
|
||
|
|
||
|
XtRealizeWidget(model);
|
||
|
}
|
||
|
XtChangeManagedSet(¤t, 1, NULL, NULL, &model, 1);
|
||
|
current = model;
|
||
|
}
|