static XConfigScreenPtr clone_screen(XConfigScreenPtr screen0, int idx) { XConfigScreenPtr screen = nvalloc(sizeof(XConfigScreenRec)); screen->identifier = nvasprintf("%s (%d)", screen0->identifier, idx); screen->device = clone_device(screen0->device, idx); screen->device_name = nvstrdup(screen->device->identifier); screen->monitor = screen0->monitor; screen->monitor_name = nvstrdup(screen0->monitor_name); screen->defaultdepth = screen0->defaultdepth; screen->displays = clone_display_list(screen0->displays); screen->options = xconfigOptionListDup(screen0->options); if (screen0->comment) screen->comment = nvstrdup(screen0->comment); /* insert the new screen after the original screen */ screen->next = screen0->next; screen0->next = screen; return screen; } /* clone_screen() */
static char *create_display_device_target_string(CtrlTarget *t, const ConfigProperties *conf) { char *target_name = NULL; char *target_prefix_name = NULL; char *display_name = NULL; char *s; if (t->protoNames[NV_DPY_PROTO_NAME_RANDR]) { target_name = t->protoNames[NV_DPY_PROTO_NAME_RANDR]; } /* If we don't have a target name here, use the full name and return. */ if (!target_name) { return nvstrdup(t->name); } /* Get the display name if the user requested it to be used. */ if (conf->booleans & CONFIG_PROPERTIES_INCLUDE_DISPLAY_NAME_IN_CONFIG_FILE) { display_name = NvCtrlGetDisplayName(t); } /* Get the target type prefix. */ target_prefix_name = nvstrdup(t->targetTypeInfo->parsed_name); nvstrtoupper(target_prefix_name); /* Build the string */ if (display_name && target_prefix_name) { s = nvasprintf("%s[%s:%s]", display_name, target_prefix_name, target_name); } else if (target_prefix_name) { s = nvasprintf("[%s:%s]", target_prefix_name, target_name); } else if (display_name) { s = nvasprintf("%s[%s]", display_name, target_name); } else { s = nvasprintf("[%s]", target_name); } free(target_prefix_name); free(display_name); return s; }
static XConfigDevicePtr clone_device(XConfigDevicePtr device0, int idx) { XConfigDevicePtr device; device = nvalloc(sizeof(XConfigDeviceRec)); device->identifier = nvasprintf("%s (%d)", device0->identifier, idx); if (device0->vendor) device->vendor = nvstrdup(device0->vendor); if (device0->board) device->board = nvstrdup(device0->board); if (device0->chipset) device->chipset = nvstrdup(device0->chipset); if (device0->busid) device->busid = nvstrdup(device0->busid); if (device0->card) device->card = nvstrdup(device0->card); if (device0->driver) device->driver = nvstrdup(device0->driver); if (device0->ramdac) device->ramdac = nvstrdup(device0->ramdac); if (device0->comment) device->comment = nvstrdup(device0->comment); /* these are needed for multiple X screens on one GPU */ device->screen = idx; device0->screen = 0; device->chipid = -1; device->chiprev = -1; device->irq = -1; device->options = xconfigOptionListDup(device0->options); /* insert the new device after the original device */ device->next = device0->next; device0->next = device; return device; } /* clone_device() */