static void MessRefreshPicker(void) { HWND hwndSoftware; int i = 0; LVFINDINFO lvfi; const char *s; windows_options o; hwndSoftware = GetDlgItem(GetMainWindow(), IDC_SWLIST); s_bIgnoreSoftwarePickerNotifies = TRUE; // Now clear everything out; this may call back into us but it should not // be problematic ListView_SetItemState(hwndSoftware, -1, 0, LVIS_SELECTED); for (device_image_interface &dev : image_interface_iterator(s_config->mconfig->root_device())) { const char *opt_name = dev.instance_name(); // get name of device slot load_options(o, OPTIONS_GAME, s_config->driver_index); s = o.value(opt_name); // get name of software in the slot if (s[0]) // if software is loaded { i = SoftwarePicker_LookupIndex(hwndSoftware, s); // see if its in the picker if (i < 0) // not there { // add already loaded software to picker, but not if its already there SoftwarePicker_AddFile(hwndSoftware, s, 1); i = SoftwarePicker_LookupIndex(hwndSoftware, s); // refresh pointer } if (i >= 0) // is there { memset(&lvfi, 0, sizeof(lvfi)); lvfi.flags = LVFI_PARAM; lvfi.lParam = i; i = ListView_FindItem(hwndSoftware, -1, &lvfi); ListView_SetItemState(hwndSoftware, i, LVIS_SELECTED, LVIS_SELECTED); // highlight it } } } s_bIgnoreSoftwarePickerNotifies = FALSE; }
static BOOL SoftwarePicker_AddFileEntry(HWND hwndPicker, LPCSTR pszFilename, UINT nZipEntryNameLength, UINT32 nCrc, BOOL bForce) { software_picker_info *pPickerInfo; file_info **ppNewIndex; file_info *pInfo; int nIndex, nSize; LPCSTR pszExtension = NULL; const device_config_image_interface *device = NULL; // first check to see if it is already here if (SoftwarePicker_LookupIndex(hwndPicker, pszFilename) >= 0) return TRUE; pPickerInfo = GetSoftwarePickerInfo(hwndPicker); // look up the device if (strrchr(pszFilename, '.')) pszExtension = strrchr(pszFilename, '.'); if ((pszExtension != NULL) && (pPickerInfo->config != NULL)) { for (bool gotone = pPickerInfo->config->mconfig->m_devicelist.first(device); gotone; gotone = device->next(device)) { if (device->uses_file_extension(pszExtension)) { break; } } } // no device? cop out unless bForce is on if ((device == NULL) && !bForce) return TRUE; // create the FileInfo structure nSize = sizeof(file_info) + strlen(pszFilename); pInfo = (file_info *) malloc(nSize); if (!pInfo) goto error; memset(pInfo, 0, nSize); // copy the filename strcpy(pInfo->file_name, pszFilename); // set up device and CRC, if specified pInfo->device = device; if ((device != NULL) && (device->has_partial_hash() != 0)) nCrc = 0; //if (nCrc != 0) //snprintf(pInfo->hash_string, ARRAY_LENGTH(pInfo->hash_string), "c:%08x#", nCrc); // set up zip entry name length, if specified if (nZipEntryNameLength > 0) pInfo->zip_entry_name = pInfo->file_name + strlen(pInfo->file_name) - nZipEntryNameLength; // calculate the subname pInfo->base_name = strrchr(pInfo->file_name, '\\'); if (pInfo->base_name) pInfo->base_name++; else pInfo->base_name = pInfo->file_name; ppNewIndex = (file_info**)malloc((pPickerInfo->file_index_length + 1) * sizeof(*pPickerInfo->file_index)); memcpy(ppNewIndex,pPickerInfo->file_index,pPickerInfo->file_index_length * sizeof(*pPickerInfo->file_index)); if (pPickerInfo->file_index) free(pPickerInfo->file_index); if (!ppNewIndex) goto error; nIndex = pPickerInfo->file_index_length++; pPickerInfo->file_index = ppNewIndex; pPickerInfo->file_index[nIndex] = pInfo; // Realize the hash SoftwarePicker_RealizeHash(hwndPicker, nIndex); // Actually insert the item into the picker Picker_InsertItemSorted(hwndPicker, nIndex); return TRUE; error: if (pInfo) free(pInfo); return FALSE; }