Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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 ;
}