Ejemplo n.º 1
0
void freeArgv(char **argv)
{
  int j;

  for (j=0; argv[j]; j++)
    XTFREE(argv[j]);
  XTFREE(argv);
}
Ejemplo n.º 2
0
void fileOpenCb(Widget w, XEvent *event, String *params, Cardinal *num_params)
{
 FileWindowRec *fw;
 FileRec *file;
 int item;
 char path[MAXPATHLEN];
 String *argv, push_action;

 if (!(fw = findFileWidget(w, &item)))  return;
 zzz();
 file = fw->files[item];
 strcpy(path, fw->directory);
 if (path[strlen(path)-1] != '/')  strcat(path, "/");
 strcat(path, file->name);
 if (S_ISDIR(file->stats.st_mode))
 {
     contractPath(path);
     chFileDir(fw, path);
 }
 else if (file->stats.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH))
 {
     String arguments = XtNewString(file->name);
     String action = (String) XtMalloc((strlen(path) + 6) * sizeof(char));

     strcat(strcpy(action, "exec "), path);
     argv = makeArgv(action, 1, &arguments);
     executeApplication(user.shell, fw->directory, argv);
     XTFREE(action);
     freeArgv(argv);
 }
 else if (file->type)
 {
     if (*(push_action = file->type->push_action))
     {
	 if (!(strcmp(push_action, "EDIT")))
	     doEdit(fw->directory, file->name);
	 else if (!(strcmp(push_action, "VIEW")))
	     doView(fw->directory, file->name);
	 else if (!(strcmp(push_action, "LOAD")))
	 {
	     zzz();
	     newApplicationWindow(path, NULL);
	     wakeUp();
	 }
	 else
	 {
	     argv = (String *) XtMalloc(sizeof(String));
	     argv[0] = XtNewString(file->name);
	     performAction(fw->shell, file->type->icon_pm.bm, push_action, fw->directory, 1, argv);
	     XTFREE(argv);
	 }
     }
 }
 else doEdit(fw->directory, file->name);
 wakeUp();
}
Ejemplo n.º 3
0
int dupObject(Widget shell, AppRec *dest, AppRec *src)
{
 FILE *fin, *fout;
 char buffer[BUFSIZ];
 size_t nr;

 if (chdir(src->directory))
     return -1;
 if (!(fin = fopen(src->fname, "r")))
 {
     chdir(user.home);
     return -1;
 }
 chdir(user.home);
 if (!(dest->fname = crtObjFileName(shell, usrObjects.obj[src->objType].atom_name)))
 {
     fclose(fin);
     return -1;
 }
 if (!(fout = fopen(dest->fname, "w")))
 {
     XTFREE(dest->fname);
     fclose(fin);
     return -1;
 }
 do
 {
     nr = fread(buffer, 1, BUFSIZ, fin);
     if (nr != fwrite(buffer, 1, nr, fout))
     {
	 fclose(fin);
	 fclose(fout);
	 chdir(src->directory);
	 unlink(dest->fname);
	 chdir(user.home);
	 XTFREE(dest->fname);
	 return -1;
     }
 } while (nr);
 fclose(fin);
 fclose(fout);
 dest->name = XtNewString(src->name);
 dest->directory = XtNewString(src->directory);
 dest->icon = XtNewString(src->icon);
 dest->push_action = XtNewString(src->push_action);
 dest->drop_action = XtNewString(src->drop_action);
 dest->objType = src->objType;
 dest->remove_file = True;
 return 0;
}
Ejemplo n.º 4
0
/*---------------------------------------------------------------------------*/
void doComHere(char *directory, char *fname)
{
  char path[MAXPATHLEN];
  char **argv;
  char default_term[1000];

  if (resources.default_term) {
    strcpy(path, "cd ");
    strcat(path, fname);
    strcat(path, "&&");
    sprintf(default_term, "siagrun terminal");
    strcat(path, default_term);

    argv = (char **) XtMalloc(4 * sizeof(char *));
    argv[0] = user.shell;
    argv[1] = "-c";
    argv[2] = path;
    argv[3] = NULL;

    executeApplication(user.shell, directory, argv);
  
    XTFREE(argv);
  }

  else
    error("No default terminal program", "");
}
Ejemplo n.º 5
0
/*---------------------------------------------------------------------------*/
void doView(char *directory, char *fname)
{
  char path[MAXPATHLEN];
  char **argv;

  if (resources.default_viewer) {

    sprintf(path, "siagrun editor");
    strcat(path, " ");
    strcat(path, fname);

    argv = (char **) XtMalloc(4 * sizeof(char *));
    argv[0] = user.shell;
    argv[1] = "-c";
    argv[2] = path;
    argv[3] = NULL;

    executeApplication(user.shell, directory, argv);
  
    XTFREE(argv);
  }

  else
    error("No default viewer", "");
}
Ejemplo n.º 6
0
void renameFileProc(XtPointer fsel, int conf)
{
 SelFileNamesRec *fnames = (SelFileNamesRec *) fsel;
 struct stat stats;
 char to[MAXPATHLEN];

 if (conf != YES)
 {
     freeSelFiles(fnames);
     return;
 }
 if (chdir(fnames->directory))
 {
     sysError(fnames->shell, "System error:");
     freeSelFiles(fnames);
     return;
 }
 chdir(user.home);
 if (fnames->target[0] != '/' && fnames->target[0] != '~' && fnames->target != 0)
 {
     strcpy(to, fnames->directory);
     if (to[strlen(to)-1] != '/')  strcat(to, "/");
 }
 else to[0] = 0;
 strcat(to, fnames->target);
 fnexpand(to);
 XTFREE(fnames->target);
 fnames->target = XtNewString(to);
 if (!(stat(to, &stats)) && S_ISDIR(stats.st_mode))
     renameDialog(fnames);
 else moveFilesProc(fsel, YES);
}
Ejemplo n.º 7
0
void selectAdd(FileWindowRec *fw, String pattern, Boolean replace_sel)
{
 SelectionRec *sel = &fw->selected;
 FileRec *file;
 int i, j;
 Boolean changed = False;

 if (replace_sel && fw->selected.n_sel)
 {
     unselectAll(fw);
     changed = True;
 }

 for (i=0; i < fw->n_files; i++)
 {
     if ((replace_sel || getSelNr(fw, i) == -1) && fnmultimatch(pattern, (file = fw->files[i])->name))
     {
	 changed = True;
	 if ((j = sel->n_sel++) >= sel->n_alloc)
	     sel->file = (FileSpec *) XTREALLOC(sel->file, (sel->n_alloc += 10) * sizeof(FileSpec));
	 sel->file[j].nr = i;
	 sel->file[j].name = XtNewString(file->name);
	 sel->n_bytes += file->stats.st_size;
	 XtVaSetValues(file->form, XmNborderColor, resources.select_color, NULL);
     }
 }
 if (changed)  updateStatus(fw);
 XTFREE(pattern);
}
Ejemplo n.º 8
0
static void placeDTIcon(DTIconRec *dticon)
{
 Dimension width;
 XmString labelstr;
 String icon_pos;

 if (x0 == -1)
 {
     /* Seems to be necessary at least under HP-UX: */
     icon_pos = XtNewString(resources.icon_pos);
     sscanf(icon_pos, "%d%d", &x0, &y0);
     XTFREE(icon_pos);
     if (x0 < 0)  x0 += winInfo.rootWidth - DTICONWIDTH;
     if (y0 < 0)  y0 += winInfo.rootHeight - DTICONHEIGHT;
 }
 dticon->x = x0;
 dticon->y = y0;
 dticon->width = dticon->app.icon_pm.width;
 dticon->height = dticon->app.icon_pm.height;
 labelstr = XmStringCreateLocalized(dticon->app.name);
 width = XmStringWidth((XmFontList) resources.icon_font, labelstr) + 2;
 dticon->height += XmStringWidth((XmFontList) resources.icon_font, labelstr) + 4;
 if (width > dticon->width)
     dticon->width = width;
 dticon->height += 2 * MARGIN;
 dticon->width += 2 * MARGIN;
 while (!tryPosition(dticon));
 dticon->x += MARGIN;
 dticon->y += MARGIN;
}
Ejemplo n.º 9
0
void removeIconProc(XtPointer awp, int conf)
{
 DTIconRec *dticon = (DTIconRec *) awp;
 int i;

 dticons_blocked = False;
 if (conf == YES)
 {
     XtDestroyWidget(dticon->shell);
     freeApplicationResources(&dticon->app);
     if (dticon->label_mask != None)
	 freePixmap(dticon->label_mask);
     if (dticon->drop_pixmap != None)
	 freePixmap(dticon->drop_pixmap);
     for (i=0; i<n_dtIcons; i++)
     {
	 if (dtIcons[i] == dticon)
	 {
	     dtIcons[i] = dtIcons[--n_dtIcons];
	     break;;
	 }
     }
     XTFREE(dticon);
     dtIcons = (DTIconRec **) XTREALLOC(dtIcons, n_dtIcons * sizeof(DTIconRec *));
     if (resources.auto_save)  writeDTIcons(True);
 }
}
Ejemplo n.º 10
0
void writeDTIconsProc(XtPointer allp, int conf)
{
    dticons_blocked = False;
    if (conf == YES)
	overwriteDTIcons(*(Boolean *)allp);
    XTFREE(allp);
}
Ejemplo n.º 11
0
String crtObjFileName(Widget shell, String atom_name)
{
 struct stat stats;
 time_t now;
 String name;

 if (stat(resources.obj_dir, &stats))
 {
     if (mkdir(resources.obj_dir, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH))
     {
	 error(shell, "Could not create directory:", resources.obj_dir);
	 return NULL;
     }
 }
 else if (!S_ISDIR(stats.st_mode))
 {
     error(shell, "Not a directory:", resources.obj_dir);
     return NULL;
 }
 now = time(NULL);
 name = (String) XtMalloc((strlen(atom_name) + 12) * sizeof(char));
 sprintf(name, "%s-%lu", atom_name, (unsigned long) now);
 chdir(resources.obj_dir);
 if (!(lstat(name, &stats)))
 {
     XTFREE(name);
     name = tempnam(resources.obj_dir, NULL);
 }
 return name;
}
Ejemplo n.º 12
0
void fileExecProc(XtPointer fnm, int conf)
{
 ExecFileRec *data = (ExecFileRec *) fnm;
 String action;

 if (conf == YES)
 {
     action = (String) XtMalloc((strlen(data->action) + strlen(data->arguments) + 2) * sizeof(char));
     sprintf(action, "%s %s", data->action, data->arguments);
     performAction(data->shell, data->icon.bm, action, data->directory, 0, NULL);
     XTFREE(action);
 }
 XTFREE(data->arguments);
 XTFREE(data->directory);
 XTFREE(data->action);
 XTFREE(data);
}
Ejemplo n.º 13
0
int readDirectory(FileList *fl_return, int *n_return, String path)
{
  FileList fl = NULL;
  DIR *dir;
  struct dirent *entry;
  register int n, m;

  if (chdir(path))
    goto error2;

  if (!(dir = opendir(".")))
    goto error2;

  for(n = 0; entry = readdir(dir); n++) {
    fl = (FileRec **) XTREALLOC(fl, (n+1)*sizeof(FileRec *));
    fl[n] = (FileRec *) XtMalloc(sizeof(FileRec));
    strcpy(fl[n]->name, entry->d_name);
    if (lstat(entry->d_name, &(fl[n]->stats)))
      goto error1;
    if (S_ISLNK(fl[n]->stats.st_mode)) {
      fl[n]->sym_link = True;
      if (stat(entry->d_name, &(fl[n]->stats)))
	goto error1;
    }
    else
      fl[n]->sym_link = False;
    fl[n]->selected = False;
  }

  if (closedir(dir))
    goto error1;

  *fl_return = fl;
  *n_return = n;
  return 0;

 error1:
  for(m = 0; m <= n; m++)
    XTFREE(fl[m]);
  XTFREE(fl);

 error2:
  *fl_return = NULL;
  *n_return = 0;
  return -1;
}
Ejemplo n.º 14
0
void filterFiles(FileWindowRec *fw, String pattern)
{
 strcpy(fw->dirFilter, pattern);
 if (pattern[0])  fw->do_filter = True;
 else  fw->do_filter = False;
 XTFREE(pattern);
 updateFileDisplay(fw, RESHOW);
}
Ejemplo n.º 15
0
void mkDirProc(XtPointer fnm, int conf)
{
 NewFileRec *nfr = (NewFileRec *) fnm;

 if (conf == YES)
 {
     if (chdir(nfr->directory))
	 sysError(nfr->shell, "Can't change to directory:");
     else if (mkdir(nfr->name, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH))
	 sysError(nfr->shell, "Can't make directory:");
     else
     {
	 markForUpdate(nfr->directory, CHECK_FILES);
	 intUpdate(CHECK_DIR);
     }
     XTFREE(nfr->name);
 }
 XTFREE(nfr->directory);
 XTFREE(nfr);
}
Ejemplo n.º 16
0
/*---------------------------------------------------------------------------*/
void fileExecAction(Widget w, XEvent *event, String *params, 
		    Cardinal *num_params)
{
  int i;
  FileWindowRec *fw;
   char **argv;

  i = findWidget(w, &fw);
  if (i == -1 || !fw) {
/*
    error("Internal error:","widget not found in fileExecAction");
*/
    return;
  }

  if (fw->files[i]->type) 
  {
    if (*fw->files[i]->type->push_action)
      if (!strcmp(fw->files[i]->type->push_action, "EDIT"))
		doEdit(fw->directory, fw->files[i]->name);
      else if (!strcmp(fw->files[i]->type->push_action, "VIEW"))
		doView(fw->directory, fw->files[i]->name);
      else if (!strcmp(fw->files[i]->type->push_action, "IMAGE"))
		doImage(fw->directory, fw->files[i]->name);
      else if (!strcmp(fw->files[i]->type->push_action, "SIAGHELP"))
		doSiaghelp(fw->directory, fw->files[i]->name);

	  else 
	  {
        int k = 0;
	    char *action = varPopup(fw->files[i]->type->icon_bm,
				fw->files[i]->type->push_action);

	 	if (!action) return;

		argv = (char **) XtMalloc( (user.arg0flag ? 6 : 5) * sizeof(char *));
		argv[k++] = user.shell;
		argv[k++] = "-c";
		argv[k++] = action;
        if (user.arg0flag)
          argv[k++] = user.shell;
		argv[k++] = fw->files[i]->name;
		argv[k] = NULL;

		executeApplication(user.shell, fw->directory, argv);

		XTFREE(argv);
      }
  } 
  else
    doEdit(fw->directory, fw->files[i]->name);
}
Ejemplo n.º 17
0
void fileOnDeskCb(Widget w, XtPointer client_data, XtPointer call_data)
{
 AppList *appl;
 AppRec newapp;
 FileWindowRec *fw = (FileWindowRec *) client_data;

 appl = applistFromFiles(fw);
 newapp.name = XtNewString(appl[0]->name);
 newapp.directory = XtNewString(appl[0]->directory);
 newapp.fname = XtNewString(appl[0]->fname);
 newapp.icon = XtNewString(appl[0]->icon);
 newapp.push_action = appl[0]->push_action;
 newapp.drop_action = appl[0]->drop_action;
 newapp.objType = APPLICATION;
 newapp.remove_file = False;
 dtIcons = (DTIconRec **) XTREALLOC(dtIcons, (n_dtIcons + 1) * sizeof(DTIconRec *));
 dtIcons[n_dtIcons] = createDTIcon(fw->shell, &newapp, -1, -1);
 displayDTIcon(dtIcons[n_dtIcons++]);
 if (resources.auto_save)  writeDTIcons(True);
 XTFREE(appl[0]);
 XTFREE(appl);
}
Ejemplo n.º 18
0
void selectRemove(FileWindowRec *fw, String pattern)
{
 SelectionRec *sel = &fw->selected;
 int i = 0, item;
 Boolean changed = False;

 while (i < sel->n_sel)
 {
     if (fnmultimatch(pattern, sel->file[i].name))
     {
	 changed = True;
	 XTFREE(sel->file[i].name);
	 item = sel->file[i].nr;
	 memcpy(&sel->file[i], &sel->file[--(sel->n_sel)], sizeof(FileSpec));
	 sel->n_bytes -= fw->files[item]->stats.st_size;
	 XtVaSetValues(fw->files[item]->form, XmNborderColor, winInfo.background, NULL);
     }
     else i++;
 }
 if (changed)  updateStatus(fw);
 XTFREE(pattern);
}
Ejemplo n.º 19
0
void filterDirectory(FileList *fl_return, int *n_return, FilterType type)
{
  FileList fl = NULL, oldfl = *fl_return;
  int n = 0, m = 0;

  for (; m < *n_return; m++)
    if (S_ISDIR(oldfl[m]->stats.st_mode) && type == Directories ||
	!S_ISDIR(oldfl[m]->stats.st_mode) && type == Files ||
	(type == All && strcmp(oldfl[m]->name,".") &&
	 strcmp(oldfl[m]->name,".."))) {
      fl = (FileList) XTREALLOC(fl, (n+1)*sizeof(FileRec *));
      fl[n] = oldfl[m];
      n++;
    }
    else
      XTFREE(oldfl[m]);
  
  XTFREE(oldfl);
  
  *fl_return = fl;
  *n_return = n;
}  
Ejemplo n.º 20
0
void newFileProc(XtPointer fnm, int conf)
{
 NewFileRec *nfr = (NewFileRec *) fnm;
 int desc;

 if (conf == YES)
 {
     if (chdir(nfr->directory))
	 sysError(nfr->shell, "Can't change to directory:");
     else if ((desc = create(nfr->name, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH)) == -1)
	 sysError(nfr->shell, "Can't create file:");
     else
     {
	 close(desc);
	 markForUpdate(nfr->directory, CHECK_FILES);
	 intUpdate(CHECK_DIR);
     }
     chdir(user.home);
     XTFREE(nfr->name);
 }
 XTFREE(nfr->directory);
 XTFREE(nfr);
}
Ejemplo n.º 21
0
void xtermCb(Widget w, XtPointer client_data, XtPointer call_data)
{
 FileWindowRec *fw = (FileWindowRec *) client_data;
 String *argv;

 zzz();
 argv = (String *) XtMalloc(4 * sizeof(String));
 argv[0] = user.shell;
 argv[1] = "-c";
 argv[2] = resources.xterm;
 argv[3] = NULL;

 executeApplication(user.shell, fw->directory, argv);

 XTFREE(argv);
 wakeUp();
}
Ejemplo n.º 22
0
void readUserObjects(void)
{
 FILE *fp;
 String atom_name, push_action, label, icon, drag_icon;
 char s[MAXAPPSTRINGLEN];
 int i, p;

 usrObjects.nr = 0;
 usrObjects.obj = NULL;

 if (!(fp = fopen(resources.usrobj_file, "r")))
 {
     if (exists(resources.usrobj_file))
	 error(topShell, "Cannot read object file", resources.usrobj_file);
     return;
 }

 for (i=0; (p = parseObj(fp, &atom_name, &push_action, &label, &icon, &drag_icon)) > 0; i++)
 {
     usrObjects.obj = (UserObjectRec *) XTREALLOC(usrObjects.obj, (i+1) * sizeof(UserObjectRec));
     usrObjects.obj[i].atom_name = XtNewString(strparse(s, atom_name, "\\:"));
     if ((usrObjects.obj[i].atom = XmInternAtom(dpy, usrObjects.obj[i].atom_name, False)) == None)
     {
	 XTFREE(usrObjects.obj[i].atom_name);
	 error(topShell, "Couldn't initialize user defined object", atom_name);
	 i--;
     }
     else
     {
	 usrObjects.obj[i].push_action = XtNewString(strparse(s, push_action, "\\:"));
	 usrObjects.obj[i].label = XtNewString(strparse(s, label, "\\:"));
	 usrObjects.obj[i].icon = XtNewString(strparse(s, icon, "\\:"));
	 usrObjects.obj[i].drag_icon = XtNewString(strparse(s, drag_icon, "\\:"));
     }
 }

 if (p == -1)
     error(topShell, "Error in objects file:", resources.usrobj_file);

 usrObjects.nr = i;

  
  if (fclose(fp))
      sysError(topShell, "Error reading objects file:");
}
Ejemplo n.º 23
0
void changeDTIconProc(XtPointer awp, int conf)
{
 DTIconRec *dticon = ((AppSpecRec *) awp)->win.dticon;

 XTFREE(awp);
 dticons_blocked = False;
 if (conf == YES) {
     XtDestroyWidget(dticon->app.form);
     if (dticon->app.loaded)  freeIcon(dticon->app.icon_pm);
     if (dticon->label_mask != None)
	 freePixmap(dticon->label_mask);
     if (dticon->drop_pixmap != None)
	 freePixmap(dticon->drop_pixmap);
     dticon->app.objType = getObjectType(dticon->app.push_action);
     readApplicationIcon(getAnyShell(), &dticon->app, ERR_POPUP);
     displayDTIcon(dticon);
     if (resources.auto_save)  writeDTIcons(True);
 }
}
Ejemplo n.º 24
0
void changeDirCb(Widget w, XtPointer client_data, XtPointer calldata)
{
 FileWindowRec *fw = (FileWindowRec *) client_data;
 char *newpath, dir[MAXPATHLEN];

 newpath = XmTextFieldGetString(w);
 if (newpath[0] != '/' && newpath[0] != '~' && newpath[0] != 0)
 {
     strcpy(dir, fw->directory);
     if (dir[strlen(dir)-1] != '/')  strcat(dir, "/");
 }
 else dir[0] = 0;
 strcat(dir, newpath);
 XTFREE(newpath);
 fnexpand(dir);
 contractPath(dir);
 if (!chFileDir(fw, dir))
     XmTextFieldSetString(fw->dirfield, fw->directory);
}
Ejemplo n.º 25
0
/*---------------------------------------------------------------------------*/
void doOpenWith(char *directory, char *fname, char *with)
 {
   char path[MAXPATHLEN];
   char **argv;
 
 
     strcpy(path, with);
     strcat(path, " ");
     strcat(path, fname);
 
     argv = (char **) XtMalloc(4 * sizeof(char *));
     argv[0] = user.shell;
     argv[1] = "-c";
     argv[2] = path;
     argv[3] = NULL;
 
     executeApplication(user.shell, directory, argv);
   
     XTFREE(argv);
 }
Ejemplo n.º 26
0
void updateIconDisplay(void)
{
  struct stat cur;
  Boolean reread = False;
  if (dticons_blocked) return;
  if (resources.check_application_files)
      if (dticons_readable)
	  reread = stat(resources.dticon_file, &cur) || cur.st_ctime >
	      dticons_stats.st_ctime || cur.st_mtime > dticons_stats.st_mtime;
      else
	  reread = !stat(resources.dticon_file, &cur);
  if (reread) {
      FILE *fp;
      AppRec *app;
      char *name, *directory, *fname, *icon, *push_action, *drop_action,
	  *xp, *yp;
      char *nname, *ndirectory, *nfname, *nicon, *npush_action, *ndrop_action;
      char s[MAXAPPSTRINGLEN];
      int i, j, p, x, y;
      zzz();
      dticons_readable = !stat(resources.dticon_file, &dticons_stats);
      if (!(fp = fopen(resources.dticon_file, "r")))
	  {
	      dticons_readable = False;
	      error(getAnyShell(), "Cannot read desktop icons from",
		    resources.dticon_file);
	      i = 0;
	      goto remove;
	  }
      /* update existing icons/append new ones */
      for (i=0; (p = parseIcon(fp, &name, &directory, &fname, &icon,
			       &push_action, &drop_action, &xp, &yp)) > 0;
		i++) {
	  if ((x = atoi(strparse(s, xp, "\\:"))) < 0)
	      x += winInfo.rootWidth - DTICONWIDTH;
	  if ((y = atoi(strparse(s, yp, "\\:"))) < 0)
	      y += winInfo.rootHeight - DTICONHEIGHT;
	  nname = XtNewString(strparse(s, name, "\\:"));
	  ndirectory = XtNewString(strparse(s, directory, "\\:"));
	  nfname = XtNewString(strparse(s, fname, "\\:"));
	  nicon = XtNewString(strparse(s, icon, "\\:"));
	  npush_action = XtNewString(strparse(s, push_action, "\\:"));
	  ndrop_action = XtNewString(strparse(s, drop_action, "\\:"));
	  if (i < n_dtIcons) {
	      DTIconRec *dticon = dtIcons[i];
	      app = &dticon->app;
	      if (!(x != dticon->x ||
		    y != dticon->y ||
		    strcmp(nname, app->name) ||
		    strcmp(ndirectory, app->directory) ||
		    strcmp(nfname, app->fname) ||
		    strcmp(nicon, app->icon) ||
		    strcmp(npush_action, app->push_action) ||
		    strcmp(ndrop_action, app->drop_action))) {
		  XTFREE(nname);
		  XTFREE(ndirectory);
		  XTFREE(nfname);
		  XTFREE(nicon);
		  XTFREE(npush_action);
		  XTFREE(ndrop_action);
		  continue;
	      }
	      XtDestroyWidget(dticon->app.form);
	      if (dticon->label_mask != None)
		  freePixmap(dticon->label_mask);
	      if (dticon->drop_pixmap != None)
		  freePixmap(dticon->drop_pixmap);
	      freeApplicationResources(&dticon->app);
	  } else {
	      dtIcons = (DTIconRec **) XTREALLOC(dtIcons, (i+1) * sizeof(DTIconRec *));
	      dtIcons[i] = (DTIconRec *) XtMalloc(sizeof(DTIconRec));
	  }
	  app = &dtIcons[i]->app;
	  app->name = nname;
	  app->directory = ndirectory;
	  app->fname = nfname;
	  app->icon = nicon;
	  app->push_action = npush_action;
	  app->drop_action = ndrop_action;
	  app->objType = getObjectType(app->push_action);
	  app->remove_file = False;
	  dtIcons[i]->x = x;
	  dtIcons[i]->y = y;
	  readApplicationIcon(getAnyShell(), app, ERR_POPUP);
	  dtIcons[i]->label_mask = None;
	  dtIcons[i]->drop_pixmap = None;
	  dtIcons[i]->moved = False;
	  dtIcons[i]->save = True;
	  displayDTIcon(dtIcons[i]);
      }
    remove:
      /* remove any remaining icons */
      for (j = i; j < n_dtIcons; j++) {
	  DTIconRec *dticon = dtIcons[j];
	  XtDestroyWidget(dticon->shell);
	  freeApplicationResources(&dticon->app);
	  if (dticon->label_mask != None)
	      freePixmap(dticon->label_mask);
	  if (dticon->drop_pixmap != None)
	      freePixmap(dticon->drop_pixmap);
	  XTFREE(dticon);
      }

      if (i < n_dtIcons)
	  dtIcons = (DTIconRec **)
	      XTREALLOC(dtIcons, i * sizeof(DTIconRec *));
      n_dtIcons = i;

      wakeUp();

      if (dticons_readable && p == -1)
	  error(getAnyShell(), "Error reading desktop icons from",
		resources.dticon_file);

      if (dticons_readable && fclose(fp))
	  sysError(getAnyShell(), "Error reading desktop icons:");
  }
}
Ejemplo n.º 27
0
void moveFilesProc(XtPointer fsel, int conf)
{
 SelFileNamesRec *fnames = (SelFileNamesRec *) fsel;
 struct stat tostats, tolstats, frstats;
 char from[MAXPATHLEN], to[MAXPATHLEN];
 String name, cwd;
 String op_name, from_err, to_err;
 size_t toend, fromend;
 int devto, devfrom, deverr = -1, i, perm, res;
 Boolean is_dir, is_link;

 if (conf != YES || !fnames->op)
 {
     freeSelFiles(fnames);
     return;
 }
 if (chdir(fnames->directory))
 {
     sysError(fnames->shell, "System error:");
     freeSelFiles(fnames);
     return;
 }
 chdir(user.home);
 switch (fnames->op)
 {
     case COPY:
	 op_name = "Copy:";
	 from_err = "Error copying";
	 to_err = "Error copying to";
	 break;
     case MOVE:
	 op_name = "Move:";
	 from_err = "Error moving";
	 to_err = "Error moving to";
	 break;
     default:  /* i.e. LINK */
	 op_name = "Link:";
	 from_err = "Error creating symlink to";
	 to_err = "Error creating symlink in";
 }
 if (fnames->target[0] != '/' && fnames->target[0] != '~' && fnames->target != 0)
 {
     strcpy(to, fnames->directory);
     if (to[strlen(to)-1] != '/')  strcat(to, "/");
 }
 else to[0] = 0;
 strcat(to, fnames->target);
 fnexpand(to);
 if (!(cwd = absolutePath(to)))
 {
     error(fnames->shell, no_target, to);
     freeSelFiles(fnames);
     return;
 }
 strcpy(to, cwd);
 XTFREE(cwd);
 fromend = strlen(strcpy(from, fnames->directory));
 if (from[fromend-1] != '/')
 {
     from[fromend++] = '/';
     from[fromend] = 0;
 }
 devfrom = findDev(from);
 if (mountDev(devto = findDev(to), False))
     deverr = devto;
 else if (mountDev(devfrom, False))
     deverr = devfrom;
 if (deverr != -1)
 {
     error(fnames->shell, "Cannot mount device on", mntable.devices[deverr].def_mpoint);
     umountDev(devto, False);
     freeSelFiles(fnames);
     return;
 }
 if (!(stat(to, &tostats)) && S_ISDIR(tostats.st_mode))
 {
     if (chdir(to) || !(perm = permission(&tostats, P_WRITE)))
     {
	 chdir(user.home);
	 if (!perm)
	     error(fnames->shell, "You have no write permission for ", to);
	 else  sysError(fnames->shell, "System error:");
	 umountDev(devto, False);
	 umountDev(devfrom, False);
	 freeSelFiles(fnames);
	 return;
     }
     chdir(user.home);
     fnames->dirtarget = True;
     toend = strlen(to);
     if (to[toend-1] != '/')
     {
	 to[toend++] = '/';
	 to[toend] = 0;
     }
 }
 else if (fnames->n_sel == 1)  fnames->dirtarget = False;
 else
 {
     error(fnames->shell, op_name, "Target for multiple files must be a folder");
     umountDev(devto, False);
     umountDev(devfrom, False);
     freeSelFiles(fnames);
     return;
 }
 if (!fnames->first)  zzz();
 XTFREE(fnames->target);
 fnames->target = XtNewString(to);
 for (i = fnames->first; i < fnames->n_sel; i++)
 {
     name = fnames->names[i];
     if (fnames->op != LINK && (!strcmp(name, ".") || !strcmp(name, "..")))
     {
	 error(fnames->shell, "Cannot move or copy . or ..", NULL);
	 continue;
     }
     strcpy(from+fromend, name);
     if (fnames->dirtarget)
     {
	 if (fnames->op != LINK && prefix(from, to))
	 {
	     String err_str, format = "Cannot move or copy %s to";
	     err_str = (String) XtMalloc((strlen(format) + strlen(from)) * sizeof(char));
	     sprintf(err_str, format, from);
	     error(fnames->shell, err_str, to);
	     XTFREE(err_str);
	     umountDev(devto, False);
	     umountDev(devfrom, False);
	     freeSelFiles(fnames);
	     wakeUp();
	     return;
	 }
	 strcpy(to+toend, name);
     }
     if (!(lstat(to, &tolstats)))
     {
	 fnames->first = i;
	 is_dir = False;
	 if (!(stat(to, &tostats)))
	 {
	     if (S_ISDIR(tostats.st_mode))
		 is_dir = True;
	     if (!stat(from, &frstats) && tostats.st_ino == frstats.st_ino)
	     {
		 error(fnames->shell, op_name, "Source and destination are identical");
		 umountDev(devto, False);
		 umountDev(devfrom, False);
		 freeSelFiles(fnames);
		 wakeUp();
		 return;
	     }
	 }
	 if (S_ISLNK(tolstats.st_mode))
	     is_link = True;
	 else  is_link = False;

	 if (fnames->conf_ovwr || (is_dir && (!is_link || fnames->op == COPY) && resources.confirm_delete_folder))
	     overwriteDialog(fnames, to, (fnames->op == COPY && is_dir && (lstat(from, &frstats) || !S_ISDIR(frstats.st_mode)))?
			     "File copy:" : op_name,
			     is_dir && (!is_link || fnames->op == COPY));
	 else overwriteProc(fsel, YES);
	 umountDev(devto, False);
	 umountDev(devfrom, False);
	 return;
     }
     switch (fnames->op)
     {
	 case COPY:	rcopy(from, to, False); res = 0; break;
	 case MOVE:	res = movefile(from, to); break;
	 default:	res = makeLink(from, to);
     }
     if (res)
     {
	 if (opError(fnames->shell, from_err, name) != YES)
	     break;
     }
     else  fnames->update = True;
 }
 umountDev(devto, False);
 umountDev(devfrom, False);
 if (fnames->update)
 {
     if (fnames->op == COPY)
	 intUpdate(CHECK_DIR);		/* Check for new subdirectories */
     if (fnames->op == MOVE)
	 markForUpdate(fnames->directory, CHECK_FILES);
     markForUpdate(to, RESHOW);
     if (fnames->op != COPY)
	 intUpdate(CHECK_DIR);
 }
 freeSelFiles(fnames);
 wakeUp();
}