void contract(int u, int v){ int anc = lca(u, v); if(rt(u)!=anc) frm[u] = v; if(rt(v)!=anc) frm[v] = u; contractPath(u, anc); contractPath(v, anc); }
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(); }
void goUpCb(Widget w, XtPointer client_data, XtPointer call_data) { FileWindowRec *fw = (FileWindowRec *) client_data; char path[MAXPATHLEN]; if (strcmp(fw->directory, "/")) { strcpy(path, fw->directory); strcat(path, "/.."); contractPath(path); chFileDir(fw, path); } }
void dirOpenCb(Widget w, XtPointer client_data, XtPointer call_data) { FileWindowRec *fw = (FileWindowRec *) client_data; char path[MAXPATHLEN]; int item; zzz(); XtVaGetValues(fw->form, XmNuserData, (XtPointer) &item, NULL); strcpy(path, fw->directory); if (path[strlen(path)-1] != '/') strcat(path, "/"); strcat(path, fw->files[item]->name); fnexpand(path); contractPath(path); newFileWindow(path, fw, NULL); wakeUp(); }
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); }