static ushort _DndIndexToTargets(Display * display, int index, Atom ** targets) { DndTargetsTable targets_table; int i ; /* again, slow: no caching here, alloc/free each time */ if (!(targets_table = TargetsTable (display)) || (index >= targets_table->num_entries)) { if (targets_table) XFree((char*)targets_table); return 0; } /* transfer the correct target list index */ *targets = (Atom*)malloc(sizeof(Atom)*targets_table-> entries[index].num_targets); memcpy((char*)*targets, (char*)targets_table->entries[index].targets, sizeof(Atom)*targets_table->entries[index].num_targets); /* free the target table and its guts */ for (i=0 ; i < targets_table->num_entries; i++) XFree((char*)targets_table->entries[i].targets); int tmp = targets_table->entries[index].num_targets; XFree((char*)targets_table); return tmp; // targets_table->entries[index].num_targets; }
extern int _DndTargetsToIndex(Display * display, Atom * targets, int num_targets) { int i, j; Atom *sorted_targets; DndTargetsTable targets_table; int index = -1 ; InitAtoms(display) ; if (!(targets_table = TargetsTable (display))|| (index >= targets_table->num_entries)) { #ifdef ENABLE_MOTIF_WARNINGS printf("_DndTargetsToIndex: cannot find the target table data\n"); #endif return -1 ; } /* sort the given target list */ sorted_targets = (Atom *) malloc(sizeof(Atom) * num_targets); memcpy (sorted_targets, targets, sizeof(Atom) * num_targets); qsort ((void *)sorted_targets, (size_t)num_targets, (size_t)sizeof(Atom), AtomCompare); /* look for a match */ for (i = 0; i < targets_table->num_entries; i++) { if (num_targets == targets_table->entries[i].num_targets) { for (j = 0; j < num_targets; j++) { if (sorted_targets[j] != targets_table->entries[i].targets[j]) { break; } } if (j == num_targets) { index = i ; break ; } } } XFree ((char *)sorted_targets); /* free the target table and its guts */ for (i=0 ; i < targets_table->num_entries; i++) XFree((char*)targets_table->entries[i].targets); XFree((char*)targets_table); #ifdef ENABLE_MOTIF_WARNINGS if (index == -1 ) printf("DndTargetsToIndex: non existing target list: unsupported\n"); #endif /* to support: need to grab the server, add our target list to the property, return index = num_entries++, and ungrab */ return index ; }