static LRESULT CALLBACK SoftwarePicker_WndProc(HWND hwndPicker, UINT nMessage, WPARAM wParam, LPARAM lParam) { software_picker_info *pPickerInfo; LRESULT rc; pPickerInfo = GetSoftwarePickerInfo(hwndPicker); rc = CallWindowProc(pPickerInfo->old_window_proc, hwndPicker, nMessage, wParam, lParam); if (nMessage == WM_DESTROY) { SoftwarePicker_InternalClear(pPickerInfo); SoftwarePicker_SetDriver(hwndPicker, NULL); free(pPickerInfo); } return rc; }
void MyFillSoftwareList(int drvindex, BOOL bForce) { BOOL is_same = 0; HWND hwndSoftwarePicker; HWND hwndSoftwareList; HWND hwndSoftwareDevView; // do we have to do anything? if (!bForce) { if (s_config != NULL) is_same = (drvindex == s_config->driver_index); else is_same = (drvindex < 0); if (is_same) return; } // free the machine config, if necessary MySoftwareListClose(); // allocate the machine config, if necessary if (drvindex >= 0) s_config = software_config_alloc(drvindex); // locate key widgets hwndSoftwarePicker = GetDlgItem(GetMainWindow(), IDC_SWLIST); hwndSoftwareList = GetDlgItem(GetMainWindow(), IDC_SOFTLIST); hwndSoftwareDevView = GetDlgItem(GetMainWindow(), IDC_SWDEVVIEW); // set up the device view DevView_SetDriver(hwndSoftwareDevView, s_config); // set up the software picker SoftwarePicker_Clear(hwndSoftwarePicker); SoftwarePicker_SetDriver(hwndSoftwarePicker, s_config); // Get the game's software path int driver_index = drvindex; windows_options o; load_options(o, OPTIONS_GAME, driver_index); const char* paths = o.value(OPTION_SWPATH); if (paths && (paths[0] > 64)) {} else // search deeper when looking for software { // not specified in driver, try parent if it has one int nParentIndex = -1; if (DriverIsClone(driver_index) == TRUE) { nParentIndex = GetParentIndex(&driver_list::driver(driver_index)); if (nParentIndex >= 0) { load_options(o, OPTIONS_PARENT, nParentIndex); paths = o.value(OPTION_SWPATH); } } if (paths && (paths[0] > 64)) {} else { // still nothing, try for a system in the 'compat' field if (nParentIndex >= 0) driver_index = nParentIndex; // now recycle variable as a compat system number nParentIndex = GetCompatIndex(&driver_list::driver(driver_index)); if (nParentIndex >= 0) { load_options(o, OPTIONS_PARENT, nParentIndex); paths = o.value(OPTION_SWPATH); } } } // These are the only paths that matter AddSoftwarePickerDirs(hwndSoftwarePicker, paths, NULL); paths = 0; // set up the software picker SoftwareList_Clear(hwndSoftwareList); SoftwareList_SetDriver(hwndSoftwareList, s_config); /* allocate the machine config */ machine_config config(driver_list::driver(drvindex),MameUIGlobal()); for (software_list_device &swlistdev : software_list_device_iterator(config.root_device())) { for (const software_info &swinfo : swlistdev.get_info()) { const software_part &swpart = swinfo.parts().front(); // search for a device with the right interface for (device_image_interface &image : image_interface_iterator(config.root_device())) { const char *interface = image.image_interface(); if (interface) { if (swpart.matches_interface(interface)) { // Extract the Usage data from the "info" fields. const char* usage = NULL; for (const feature_list_item &flist : swinfo.other_info()) if (flist.name() == "usage") usage = flist.value().c_str(); // Now actually add the item SoftwareList_AddFile(hwndSoftwareList, swinfo.shortname().c_str(), swlistdev.list_name().c_str(), swinfo.longname().c_str(), swinfo.publisher().c_str(), swinfo.year().c_str(), usage, image.brief_instance_name()); break; } } } } } }