/** * Fills a display mode M with a built-in mode of name pszName and dimensions * cx and cy. */ static void vboxFillDisplayMode(ScrnInfoPtr pScrn, DisplayModePtr m, const char *pszName, unsigned cx, unsigned cy) { VBOXPtr pVBox = pScrn->driverPrivate; TRACE_LOG("pszName=%s, cx=%u, cy=%u\n", pszName, cx, cy); m->status = MODE_OK; m->type = M_T_BUILTIN; /* Older versions of VBox only support screen widths which are a multiple * of 8 */ if (pVBox->fAnyX) m->HDisplay = cx; else m->HDisplay = cx & ~7; m->HSyncStart = m->HDisplay + 2; m->HSyncEnd = m->HDisplay + 4; m->HTotal = m->HDisplay + 6; m->VDisplay = cy; m->VSyncStart = m->VDisplay + 2; m->VSyncEnd = m->VDisplay + 4; m->VTotal = m->VDisplay + 6; m->Clock = m->HTotal * m->VTotal * 60 / 1000; /* kHz */ if (pszName) { if (m->name) free(m->name); m->name = xnfstrdup(pszName); } }
static void CheckSbusDevice(const char *device, int fbNum) { int fd, i; struct fbgattr fbattr; sbusDevicePtr psdp; fd = open(device, O_RDONLY, 0); if (fd < 0) return; memset(&fbattr, 0, sizeof(fbattr)); if (ioctl(fd, FBIOGATTR, &fbattr) < 0) { if (ioctl(fd, FBIOGTYPE, &fbattr.fbtype) < 0) { close(fd); return; } } close(fd); for (i = 0; sbusDeviceTable[i].devId; i++) if (sbusDeviceTable[i].fbType == fbattr.fbtype.fb_type) break; if (! sbusDeviceTable[i].devId) return; xf86SbusInfo = xnfrealloc(xf86SbusInfo, sizeof(psdp) * (++xf86nSbusInfo + 1)); xf86SbusInfo[xf86nSbusInfo] = NULL; xf86SbusInfo[xf86nSbusInfo - 1] = psdp = xnfcalloc(sizeof (sbusDevice), 1); psdp->devId = sbusDeviceTable[i].devId; psdp->fbNum = fbNum; psdp->device = xnfstrdup(device); psdp->width = fbattr.fbtype.fb_width; psdp->height = fbattr.fbtype.fb_height; psdp->fd = -1; }
static XF86ConfInputPtr configureInputSection(void) { XF86ConfInputPtr mouse = NULL; parsePrologue(XF86ConfInputPtr, XF86ConfInputRec) ptr->inp_identifier = xnfstrdup("Keyboard0"); ptr->inp_driver = xnfstrdup("kbd"); ptr->list.next = NULL; /* Crude mechanism to auto-detect mouse (os dependent) */ { int fd; fd = open(DFLT_MOUSE_DEV, 0); if (fd != -1) { foundMouse = TRUE; close(fd); } } mouse = calloc(1, sizeof(XF86ConfInputRec)); mouse->inp_identifier = xnfstrdup("Mouse0"); mouse->inp_driver = xnfstrdup("mouse"); mouse->inp_option_lst = xf86addNewOption(mouse->inp_option_lst, xnfstrdup("Protocol"), xnfstrdup(DFLT_MOUSE_PROTO)); mouse->inp_option_lst = xf86addNewOption(mouse->inp_option_lst, xnfstrdup("Device"), xnfstrdup(DFLT_MOUSE_DEV)); mouse->inp_option_lst = xf86addNewOption(mouse->inp_option_lst, xnfstrdup("ZAxisMapping"), xnfstrdup("4 5 6 7")); ptr = (XF86ConfInputPtr) xf86addListItem((glp) ptr, (glp) mouse); return ptr; }
static void AppendToList(const char *s, const char ***list, int *lines) { char *str, *newstr, *p; str = xnfstrdup(s); for (p = strtok(str, "\n"); p; p = strtok(NULL, "\n")) { (*lines)++; *list = xnfrealloc(*list, (*lines + 1) * sizeof(**list)); newstr = xnfalloc(strlen(p) + 2); strcpy(newstr, p); strcat(newstr, "\n"); (*list)[*lines - 1] = newstr; (*list)[*lines] = NULL; } free(str); }
static void listPossibleVideoDrivers(char *matches[], int nmatches) { int i; for (i = 0 ; i < nmatches ; i++) { matches[i] = NULL; } i = 0; #ifdef sun /* Check for driver type based on /dev/fb type and if valid, use it instead of PCI bus probe results */ if (xf86Info.consoleFd >= 0) { struct vis_identifier visid; const char *cp; extern char xf86SolarisFbDev[PATH_MAX]; int iret; SYSCALL(iret = ioctl(xf86Info.consoleFd, VIS_GETIDENTIFIER, &visid)); if (iret < 0) { int fbfd; fbfd = open(xf86SolarisFbDev, O_RDONLY); if (fbfd >= 0) { SYSCALL(iret = ioctl(fbfd, VIS_GETIDENTIFIER, &visid)); close(fbfd); } } if (iret < 0) { xf86Msg(X_WARNING, "could not get frame buffer identifier from %s\n", xf86SolarisFbDev); } else { xf86Msg(X_PROBED, "console driver: %s\n", visid.name); /* Special case from before the general case was set */ if (strcmp(visid.name, "NVDAnvda") == 0) { matches[i++] = xnfstrdup("nvidia"); } /* General case - split into vendor name (initial all-caps prefix) & driver name (rest of the string). */ if (strcmp(visid.name, "SUNWtext") != 0) { for (cp = visid.name; (*cp != '\0') && isupper(*cp); cp++) { /* find end of all uppercase vendor section */ } if ((cp != visid.name) && (*cp != '\0')) { char *driverName = xnfstrdup(cp); char *vendorName = xnfstrdup(visid.name); vendorName[cp - visid.name] = '\0'; matches[i++] = vendorName; matches[i++] = driverName; } } } } #endif #ifdef __sparc__ { char *sbusDriver = sparcDriverName(); if (sbusDriver) matches[i++] = xnfstrdup(sbusDriver); } #endif i = xf86PciMatchDriver(matches, nmatches); /* Fallback to platform default hardware */ if (i < (nmatches - 1)) { #if defined(__i386__) || defined(__amd64__) || defined(__hurd__) matches[i++] = xnfstrdup("vesa"); #elif defined(__sparc__) && !defined(sun) matches[i++] = xnfstrdup("sunffb"); #endif } /* Fallback to platform default frame buffer driver */ if (i < (nmatches - 1)) { #if !defined(__linux__) && defined(__sparc__) matches[i++] = xnfstrdup("wsfb"); #else matches[i++] = xnfstrdup("fbdev"); #endif } }
void vmwareAddDefaultMode(ScrnInfoPtr pScrn, uint32 dwidth, uint32 dheight) { DisplayModePtr *monitorModes = &pScrn->monitor->Modes; DisplayModePtr modes = NULL; if (monitorModes == NULL || *monitorModes == NULL) { goto out_err; } #ifdef HAVE_XORG_SERVER_1_2_0 if (dwidth && dheight) { MonPtr monitor = pScrn->monitor; DisplayModePtr mode = NULL; DisplayModeRec dynamic = { MODEPREFIX, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, MODESUFFIX }; unsigned dispModeCount = 0; char **dispModeList; char *dynModeName; char name[80]; VMWAREPtr pVMWARE = VMWAREPTR(pScrn); /* First, add the default mode name to the display mode * requests. */ snprintf(name, sizeof(name), VMW_DEFLT_MODE_NAME, dwidth, dheight); dynModeName = xnfstrdup(name); if (!dynModeName || !pScrn->display) goto out_err; if (pScrn->display->modes) { dispModeList = pScrn->display->modes; while(*dispModeList) dispModeList++; dispModeCount = (unsigned)(((size_t)dispModeList - (size_t)pScrn->display->modes) / sizeof(*dispModeList)); } dispModeList = xnfcalloc(dispModeCount + 2, sizeof(*dispModeList)); if (!dispModeList) goto out_err; memcpy(dispModeList, pScrn->display->modes, dispModeCount * sizeof(*dispModeList)); dispModeList[dispModeCount] = dynModeName; pScrn->display->modes = dispModeList; /* Then, add the default mode itself. */ dynamic.name = name; dynamic.HDisplay = dwidth; dynamic.HSyncStart = dynamic.HDisplay + 1; dynamic.HSyncEnd = dynamic.HSyncStart + 1; dynamic.HTotal = dynamic.HSyncEnd * 5 / 4; dynamic.VDisplay = dheight; dynamic.VSyncStart = dynamic.VDisplay + 1; dynamic.VSyncEnd = dynamic.VSyncStart + 1; dynamic.VTotal = dynamic.VSyncEnd + 1; if (monitor->nVrefresh > 0) dynamic.VRefresh = monitor->vrefresh[0].lo; else dynamic.VRefresh = 60; dynamic.Clock = dynamic.VRefresh * dynamic.VTotal * dynamic.HTotal / 1000; mode = xf86DuplicateMode(&dynamic); modes = xf86ModesAdd(modes, mode); if (dispModeCount == 0) { /* * Set up a large virtual size, so that we allow also * setting modes larger than the initial mode. * * We might also want to consider the case where * dispModeCount != 0, but the requested display modes * are not available. This is sufficient for now. */ if (pScrn->display->virtualX == 0) pScrn->display->virtualX = pVMWARE->maxWidth; if (pScrn->display->virtualY == 0) pScrn->display->virtualY = pVMWARE->maxHeight; } } *monitorModes = xf86ModesAdd(*monitorModes, modes); #else (void) modes; #endif return; out_err: xf86DrvMsg(pScrn->scrnIndex, X_ERROR, "Failed to add default mode."); }
static XF86ConfLayoutPtr configureLayoutSection(void) { int scrnum = 0; parsePrologue(XF86ConfLayoutPtr, XF86ConfLayoutRec) ptr->lay_identifier = "X.org Configured"; { XF86ConfInputrefPtr iptr; iptr = malloc(sizeof(XF86ConfInputrefRec)); iptr->list.next = NULL; iptr->iref_option_lst = NULL; iptr->iref_inputdev_str = xnfstrdup("Mouse0"); iptr->iref_option_lst = xf86addNewOption(iptr->iref_option_lst, xnfstrdup("CorePointer"), NULL); ptr->lay_input_lst = (XF86ConfInputrefPtr) xf86addListItem((glp) ptr->lay_input_lst, (glp) iptr); } { XF86ConfInputrefPtr iptr; iptr = malloc(sizeof(XF86ConfInputrefRec)); iptr->list.next = NULL; iptr->iref_option_lst = NULL; iptr->iref_inputdev_str = xnfstrdup("Keyboard0"); iptr->iref_option_lst = xf86addNewOption(iptr->iref_option_lst, xnfstrdup("CoreKeyboard"), NULL); ptr->lay_input_lst = (XF86ConfInputrefPtr) xf86addListItem((glp) ptr->lay_input_lst, (glp) iptr); } for (scrnum = 0; scrnum < nDevToConfig; scrnum++) { XF86ConfAdjacencyPtr aptr; char *tmp; aptr = malloc(sizeof(XF86ConfAdjacencyRec)); aptr->list.next = NULL; aptr->adj_x = 0; aptr->adj_y = 0; aptr->adj_scrnum = scrnum; XNFasprintf(&tmp, "Screen%d", scrnum); aptr->adj_screen_str = tmp; if (scrnum == 0) { aptr->adj_where = CONF_ADJ_ABSOLUTE; aptr->adj_refscreen = NULL; } else { aptr->adj_where = CONF_ADJ_RIGHTOF; XNFasprintf(&tmp, "Screen%d", scrnum - 1); aptr->adj_refscreen = tmp; } ptr->lay_adjacency_lst = (XF86ConfAdjacencyPtr) xf86addListItem((glp) ptr->lay_adjacency_lst, (glp) aptr); } return ptr; }
static XF86ConfDevicePtr configureDeviceSection(int screennum) { OptionInfoPtr p; int i = 0; char *identifier; parsePrologue(XF86ConfDevicePtr, XF86ConfDeviceRec) /* Move device info to parser structure */ if (asprintf(&identifier, "Card%d", screennum) == -1) identifier = NULL; ptr->dev_identifier = identifier; ptr->dev_chipset = DevToConfig[screennum].GDev.chipset; ptr->dev_busid = DevToConfig[screennum].GDev.busID; ptr->dev_driver = DevToConfig[screennum].GDev.driver; ptr->dev_ramdac = DevToConfig[screennum].GDev.ramdac; for (i = 0; i < MAXDACSPEEDS; i++) ptr->dev_dacSpeeds[i] = DevToConfig[screennum].GDev.dacSpeeds[i]; ptr->dev_videoram = DevToConfig[screennum].GDev.videoRam; ptr->dev_bios_base = DevToConfig[screennum].GDev.BiosBase; ptr->dev_mem_base = DevToConfig[screennum].GDev.MemBase; ptr->dev_io_base = DevToConfig[screennum].GDev.IOBase; ptr->dev_clockchip = DevToConfig[screennum].GDev.clockchip; for (i = 0; (i < MAXCLOCKS) && (i < DevToConfig[screennum].GDev.numclocks); i++) ptr->dev_clock[i] = DevToConfig[screennum].GDev.clock[i]; ptr->dev_clocks = i; ptr->dev_chipid = DevToConfig[screennum].GDev.chipID; ptr->dev_chiprev = DevToConfig[screennum].GDev.chipRev; ptr->dev_irq = DevToConfig[screennum].GDev.irq; /* Make sure older drivers don't segv */ if (DevToConfig[screennum].GDev.options) { /* Fill in the available driver options for people to use */ const char *descrip = " ### Available Driver options are:-\n" " ### Values: <i>: integer, <f>: float, " "<bool>: \"True\"/\"False\",\n" " ### <string>: \"String\", <freq>: \"<f> Hz/kHz/MHz\",\n" " ### <percent>: \"<f>%\"\n" " ### [arg]: arg optional\n"; ptr->dev_comment = xnfstrdup(descrip); if (ptr->dev_comment) { for (p = DevToConfig[screennum].GDev.options; p->name != NULL; p++) { char *p_e; const char *prefix = " #Option "; const char *middle = " \t# "; const char *suffix = "\n"; const char *opttype = optionTypeToString(p->type); char *optname; int len = strlen(ptr->dev_comment) + strlen(prefix) + strlen(middle) + strlen(suffix) + 1; if (asprintf(&optname, "\"%s\"", p->name) == -1) break; len += max(20, strlen(optname)); len += strlen(opttype); ptr->dev_comment = realloc(ptr->dev_comment, len); if (!ptr->dev_comment) break; p_e = ptr->dev_comment + strlen(ptr->dev_comment); sprintf(p_e, "%s%-20s%s%s%s", prefix, optname, middle, opttype, suffix); free(optname); } } } return ptr; }
/* This function is used to provide a workaround for binary drivers that * don't export their PCI ID's properly. If distros don't end up using this * feature it can and should be removed because the symbol-based resolution * scheme should be the primary one */ static void matchDriverFromFiles (char** matches, uint16_t match_vendor, uint16_t match_chip) { DIR *idsdir; FILE *fp; struct dirent *direntry; char *line = NULL; size_t len; ssize_t read; char path_name[256], vendor_str[5], chip_str[5]; uint16_t vendor, chip; int i, j; idsdir = opendir(PCI_TXT_IDS_PATH); if (!idsdir) return; xf86Msg(X_INFO, "Scanning %s directory for additional PCI ID's supported by the drivers\n", PCI_TXT_IDS_PATH); direntry = readdir(idsdir); /* Read the directory */ while (direntry) { if (direntry->d_name[0] == '.') { direntry = readdir(idsdir); continue; } len = strlen(direntry->d_name); /* A tiny bit of sanity checking. We should probably do better */ if (strncmp(&(direntry->d_name[len-4]), ".ids", 4) == 0) { /* We need the full path name to open the file */ strncpy(path_name, PCI_TXT_IDS_PATH, 256); strncat(path_name, "/", 1); strncat(path_name, direntry->d_name, (256 - strlen(path_name) - 1)); fp = fopen(path_name, "r"); if (fp == NULL) { xf86Msg(X_ERROR, "Could not open %s for reading. Exiting.\n", path_name); goto end; } /* Read the file */ #ifdef __GLIBC__ while ((read = getline(&line, &len, fp)) != -1) { #else while ((line = fgetln(fp, &len)) != (char *)NULL) { #endif /* __GLIBC __ */ xchomp(line); if (isdigit(line[0])) { strncpy(vendor_str, line, 4); vendor_str[4] = '\0'; vendor = (int)strtol(vendor_str, NULL, 16); if ((strlen(&line[4])) == 0) { chip_str[0] = '\0'; chip = -1; } else { /* Handle trailing whitespace */ if (isspace(line[4])) { chip_str[0] = '\0'; chip = -1; } else { /* Ok, it's a real ID */ strncpy(chip_str, &line[4], 4); chip_str[4] = '\0'; chip = (int)strtol(chip_str, NULL, 16); } } if (vendor == match_vendor && chip == match_chip ) { i = 0; while (matches[i]) { i++; } matches[i] = (char*)xalloc(sizeof(char) * strlen(direntry->d_name) - 3); if (!matches[i]) { xf86Msg(X_ERROR, "Could not allocate space for the module name. Exiting.\n"); goto end; } /* hack off the .ids suffix. This should guard * against other problems, but it will end up * taking off anything after the first '.' */ for (j = 0; j < (strlen(direntry->d_name) - 3) ; j++) { if (direntry->d_name[j] == '.') { matches[i][j] = '\0'; break; } else { matches[i][j] = direntry->d_name[j]; } } xf86Msg(X_INFO, "Matched %s from file name %s\n", matches[i], direntry->d_name); } } else { /* TODO Handle driver overrides here */ } } fclose(fp); } direntry = readdir(idsdir); } end: xfree(line); closedir(idsdir); } #endif /* __linux__ */ static void listPossibleVideoDrivers(char *matches[], int nmatches) { struct pci_device * info = NULL; struct pci_device_iterator *iter; int i; for (i = 0 ; i < nmatches ; i++) { matches[i] = NULL; } i = 0; #ifdef sun /* Check for driver type based on /dev/fb type and if valid, use it instead of PCI bus probe results */ if (xf86Info.consoleFd >= 0) { struct vis_identifier visid; const char *cp; extern char xf86SolarisFbDev[PATH_MAX]; int iret; SYSCALL(iret = ioctl(xf86Info.consoleFd, VIS_GETIDENTIFIER, &visid)); if (iret < 0) { int fbfd; fbfd = open(xf86SolarisFbDev, O_RDONLY); if (fbfd >= 0) { SYSCALL(iret = ioctl(fbfd, VIS_GETIDENTIFIER, &visid)); close(fbfd); } } if (iret < 0) { xf86Msg(X_WARNING, "could not get frame buffer identifier from %s\n", xf86SolarisFbDev); } else { xf86Msg(X_PROBED, "console driver: %s\n", visid.name); /* Special case from before the general case was set */ if (strcmp(visid.name, "NVDAnvda") == 0) { matches[i++] = xnfstrdup("nvidia"); } /* General case - split into vendor name (initial all-caps prefix) & driver name (rest of the string). */ if (strcmp(visid.name, "SUNWtext") != 0) { for (cp = visid.name; (*cp != '\0') && isupper(*cp); cp++) { /* find end of all uppercase vendor section */ } if ((cp != visid.name) && (*cp != '\0')) { char *driverName = xnfstrdup(cp); char *vendorName = xnfstrdup(visid.name); vendorName[cp - visid.name] = '\0'; matches[i++] = vendorName; matches[i++] = driverName; } } } } #endif #ifdef __sparc__ { char *sbusDriver = sparcDriverName(); if (sbusDriver) matches[i++] = xnfstrdup(sbusDriver); } #endif /* Find the primary device, and get some information about it. */ iter = pci_slot_match_iterator_create(NULL); while ((info = pci_device_next(iter)) != NULL) { if (xf86IsPrimaryPci(info)) { break; } } pci_iterator_destroy(iter); if (!info) { ErrorF("Primary device is not PCI\n"); } #ifdef __linux__ else { matchDriverFromFiles(matches, info->vendor_id, info->device_id); } #endif /* __linux__ */ for (i = 0; (i < nmatches) && (matches[i]); i++) { /* find end of matches list */ } if ((info != NULL) && (i < nmatches)) { i += videoPtrToDriverList(info, &(matches[i]), nmatches - i); } /* Fallback to platform default hardware */ if (i < (nmatches - 1)) { #if defined(__i386__) || defined(__amd64__) || defined(__hurd__) matches[i++] = xnfstrdup("vesa"); #elif defined(__sparc__) && !defined(sun) matches[i++] = xnfstrdup("sunffb"); #endif } /* Fallback to platform default frame buffer driver */ if (i < (nmatches - 1)) { #if !defined(__linux__) && defined(__sparc__) matches[i++] = xnfstrdup("wsfb"); #else matches[i++] = xnfstrdup("fbdev"); #endif } } /* copy a screen section and enter the desired driver * and insert it at i in the list of screens */ static Bool copyScreen(confScreenPtr oscreen, GDevPtr odev, int i, char *driver) { GDevPtr cptr = NULL; xf86ConfigLayout.screens[i].screen = xnfcalloc(1, sizeof(confScreenRec)); if(!xf86ConfigLayout.screens[i].screen) return FALSE; memcpy(xf86ConfigLayout.screens[i].screen, oscreen, sizeof(confScreenRec)); cptr = xcalloc(1, sizeof(GDevRec)); if (!cptr) return FALSE; memcpy(cptr, odev, sizeof(GDevRec)); cptr->identifier = Xprintf("Autoconfigured Video Device %s", driver); cptr->driver = driver; /* now associate the new driver entry with the new screen entry */ xf86ConfigLayout.screens[i].screen->device = cptr; cptr->myScreenSection = xf86ConfigLayout.screens[i].screen; return TRUE; }
static int videoPtrToDriverList(struct pci_device *dev, char *returnList[], int returnListMax) { int i; /* Add more entries here if we ever return more than 4 drivers for any device */ char *driverList[5] = { NULL, NULL, NULL, NULL, NULL }; switch (dev->vendor_id) { /* AMD Geode LX */ case 0x1022: if (dev->device_id == 0x2081) driverList[0] = "geode"; break; /* older Geode products acquired by AMD still carry an NSC vendor_id */ case 0x100b: if (dev->device_id == 0x0030) { /* NSC Geode GX2 specifically */ driverList[0] = "geode"; /* GX2 support started its life in the NSC tree and was later forked by AMD for GEODE so we keep it as a backup */ driverList[1] = "nsc"; } else /* other NSC variant e.g. 0x0104 (SC1400), 0x0504 (SCx200) */ driverList[0] = "nsc"; break; /* Cyrix Geode GX1 */ case 0x1078: if (dev->device_id == 0x0104) driverList[0] = "cyrix"; break; case 0x1142: driverList[0] = "apm"; break; case 0xedd8: driverList[0] = "ark"; break; case 0x1a03: driverList[0] = "ast"; break; case 0x1002: driverList[0] = "ati"; break; case 0x102c: driverList[0] = "chips"; break; case 0x1013: driverList[0] = "cirrus"; break; case 0x3d3d: driverList[0] = "glint"; break; case 0x105d: driverList[0] = "i128"; break; case 0x8086: if ((dev->device_id == 0x00d1) || (dev->device_id == 0x7800)) { driverList[0] = "i740"; } else if (dev->device_id == 0x8108) { break; /* "hooray" for poulsbo */ } else { driverList[0] = "intel"; } break; case 0x102b: driverList[0] = "mga"; break; case 0x10c8: driverList[0] = "neomagic"; break; case 0x10de: case 0x12d2: driverList[0] = "nv"; break; case 0x1106: driverList[0] = "openchrome"; break; case 0x1b36: driverList[0] = "qxl"; break; case 0x1163: driverList[0] = "rendition"; break; case 0x5333: switch (dev->device_id) { case 0x88d0: case 0x88d1: case 0x88f0: case 0x8811: case 0x8812: case 0x8814: case 0x8901: driverList[0] = "s3"; break; case 0x5631: case 0x883d: case 0x8a01: case 0x8a10: case 0x8c01: case 0x8c03: case 0x8904: case 0x8a13: driverList[0] = "s3virge"; break; default: driverList[0] = "savage"; break; } break; case 0x1039: driverList[0] = "sis"; break; case 0x126f: driverList[0] = "siliconmotion"; break; case 0x121a: if (dev->device_id < 0x0003) driverList[0] = "voodoo"; else driverList[0] = "tdfx"; break; case 0x1011: driverList[0] = "tga"; break; case 0x1023: driverList[0] = "trident"; break; case 0x100c: driverList[0] = "tseng"; break; case 0x80ee: driverList[0] = "vboxvideo"; break; case 0x15ad: driverList[0] = "vmware"; break; case 0x18ca: if (dev->device_id == 0x47) driverList[0] = "xgixp"; else driverList[0] = "xgi"; break; default: break; } for (i = 0; (i < returnListMax) && (driverList[i] != NULL); i++) { returnList[i] = xnfstrdup(driverList[i]); } return i; /* Number of entries added */ }
/** * Start xkbcomp, let the callback write into xkbcomp's stdin. When done, * return a strdup'd copy of the file name we've written to. */ static char * RunXkbComp(xkbcomp_buffer_callback callback, void *userdata) { FILE *out; char *buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX]; const char *emptystring = ""; char *xkbbasedirflag = NULL; const char *xkbbindir = emptystring; const char *xkbbindirsep = emptystring; #ifdef WIN32 /* WIN32 has no popen. The input must be stored in a file which is used as input for xkbcomp. xkbcomp does not read from stdin. */ char tmpname[PATH_MAX]; const char *xkmfile = tmpname; #else const char *xkmfile = "-"; #endif snprintf(keymap, sizeof(keymap), "server-%s", display); OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir)); #ifdef WIN32 strcpy(tmpname, Win32TempDir()); strcat(tmpname, "\\xkb_XXXXXX"); (void) mktemp(tmpname); #endif if (XkbBaseDirectory != NULL) { if (asprintf(&xkbbasedirflag, "\"-R%s\"", XkbBaseDirectory) == -1) xkbbasedirflag = NULL; } if (XkbBinDirectory != NULL) { int ld = strlen(XkbBinDirectory); int lps = strlen(PATHSEPARATOR); xkbbindir = XkbBinDirectory; if ((ld >= lps) && (strcmp(xkbbindir + ld - lps, PATHSEPARATOR) != 0)) { xkbbindirsep = PATHSEPARATOR; } } if (asprintf(&buf, "\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" " "-em1 %s -emp %s -eml %s \"%s%s.xkm\"", xkbbindir, xkbbindirsep, ((xkbDebugFlags < 2) ? 1 : ((xkbDebugFlags > 10) ? 10 : (int) xkbDebugFlags)), xkbbasedirflag ? xkbbasedirflag : "", xkmfile, PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1, xkm_output_dir, keymap) == -1) buf = NULL; free(xkbbasedirflag); if (!buf) { LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp: not enough memory\n"); return NULL; } #ifndef WIN32 out = Popen(buf, "w"); #else out = fopen(tmpname, "w"); #endif if (out != NULL) { /* Now write to xkbcomp */ (*callback)(out, userdata); #ifndef WIN32 if (Pclose(out) == 0) #else if (fclose(out) == 0 && System(buf) >= 0) #endif { if (xkbDebugFlags) DebugF("[xkb] xkb executes: %s\n", buf); free(buf); #ifdef WIN32 unlink(tmpname); #endif return xnfstrdup(keymap); } else { LogMessage(X_ERROR, "Error compiling keymap (%s) executing '%s'\n", keymap, buf); } #ifdef WIN32 /* remove the temporary file */ unlink(tmpname); #endif } else { #ifndef WIN32 LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp\n"); #else LogMessage(X_ERROR, "Could not open file %s\n", tmpname); #endif } free(buf); return NULL; }