--- hw/xfree86/common/xf86AutoConfig.c +++ hw/xfree86/common/xf86AutoConfig.c @@ -539,34 +541,13 @@ } } -static char* -chooseVideoDriver(void) -{ - char *chosen_driver = NULL; - int i; - char *matches[20]; /* If we have more than 20 drivers we're in trouble */ - - listPossibleVideoDrivers(matches, 20); - - /* TODO Handle multiple drivers claiming to support the same PCI ID */ - chosen_driver = matches[0]; - - xf86Msg(X_DEFAULT, "Matched %s for the autoconfigured driver\n", - chosen_driver); - - for (i = 0; matches[i] ; i++) { - if (matches[i] != chosen_driver) { - xfree(matches[i]); - } - } - - return chosen_driver; -} - GDevPtr autoConfigDevice(GDevPtr preconf_device) { - GDevPtr ptr = NULL; + GDevPtr ptr = NULL, cptr = NULL; + char *matches[20]; /* If we have more than 20 drivers we're in trouble */ + int num_matches = 0, num_screens = 0, i; + screenLayoutPtr slp; if (!xf86configptr) { return NULL; @@ -589,14 +571,49 @@ ptr->driver = NULL; } if (!ptr->driver) { - ptr->driver = chooseVideoDriver(); + listPossibleVideoDrivers(matches, 20); + for (; matches[num_matches] ; num_matches++); + slp = xf86ConfigLayout.screens; + if (slp) { + for (; slp[num_screens].screen ; num_screens++); + xf86ConfigLayout.screens = xnfcalloc(1,(num_screens+num_matches+1) * sizeof(screenLayoutRec)); + xf86ConfigLayout.screens[0] = slp[0]; + } + for (i=0; idriver = matches[0]; + if (slp && !xf86ConfigLayout.screens[0].screen->device) { + xf86ConfigLayout.screens[0].screen->device = ptr; + ptr->myScreenSection = xf86ConfigLayout.screens[0].screen; + } + } else { + if (slp) { + xf86ConfigLayout.screens[i].screen = xnfcalloc(1, sizeof(confScreenRec)); + if(!xf86ConfigLayout.screens[i].screen) + return NULL; + memcpy(xf86ConfigLayout.screens[i].screen, slp[0].screen, sizeof(confScreenRec)); + } + cptr = xcalloc(1, sizeof(GDevRec)); + if (!cptr) + return NULL; + memcpy(cptr, ptr, sizeof(GDevRec)); + cptr->identifier = xnfcalloc(1,strlen("Autoconfigured Video Device ")+strlen(matches[i])+1); + sprintf(cptr->identifier, "Autoconfigured Video Device %s", matches[i]); + cptr->driver = matches[i]; + if (slp) { + xf86ConfigLayout.screens[i].screen->device = cptr; + cptr->myScreenSection = xf86ConfigLayout.screens[i].screen; + } + } + } + for (i=1;iscreen->device) { - xf86ConfigLayout.screens->screen->device = ptr; - ptr->myScreenSection = xf86ConfigLayout.screens->screen; - } + /* TODO Handle rest of multiple screen sections */ xf86Msg(X_DEFAULT, "Assigned the driver to the xf86ConfigLayout\n"); return ptr;