home *** CD-ROM | disk | FTP | other *** search
- /** XBrowser V1.0 by Andy Colebourne **/
-
- /** Some of this code is not very tidy! I may clean it up one day. **/
- /** if you find any bugs, please mail me with the details (and fixes?) **/
-
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/param.h>
- #include <dirent.h>
-
- #include <X11/Intrinsic.h>
- #include <Xm/Xm.h>
- #include <Xm/Label.h>
- #include <Xm/RowColumn.h>
- #include <Xm/Text.h>
- #include <Xm/List.h>
- #include <Xm/PushB.h>
- #include <Xm/Form.h>
- #include <Xm/Frame.h>
- #include <Xm/SelectioB.h>
- #include <Xm/DialogS.h>
-
- #define VERSIONSTRING "XBrowser Version 1.0"
- #define MAGIC_FILE "xbrowser.magic"
- #define BUTTONS_FILE "xbrowser.buttons"
-
- String fallback_resources[] = {
- "*title*fontList: *-times-bold-r-*-*-*-140-*" ,
- "*textwindow.rows: 24",
- "*textwindow.columns: 80",
- "*sidelist.visibleItemCount: 12",
- NULL,
- };
-
-
- #define DIRSIZE 1000
- #define STRING(A) strcpy(malloc(strlen(A)+1),A);
- #define MFILE 0
- #define MSUFFIX 1
- #define LEFT 0
- #define RIGHT 1
-
- char leftcd[MAXPATHLEN];
- char rightcd[MAXPATHLEN];
- Widget toplevel, leftinfolabel, rightinfolabel;
- char *astring;
- Boolean debug;
- Boolean readaftercommand;
-
-
- struct Entry
- {
- char *name;
- off_t size;
- Boolean dir;
- int mode;
- char *path;
- char *fullname;
- };
-
-
- struct Magic
- {
- int mtype;
- char *mname;
- char *mstring;
- Boolean mreread;
-
- };
-
-
- struct Button
- {
- int context;
- char *command;
- Boolean reread;
- };
-
-
- #define BALL 0
- #define BEACH 1
- #define BCOMMAND 2
- #define BSOURCEDEST 3
- #define BALLPATH 4
-
- struct Button *buttonlist[255];
- int num_buttons;
-
- struct Magic *magiclist[255];
- int num_magic;
-
- struct Entry *leftptrs[DIRSIZE];
- struct Entry *rightptrs[DIRSIZE];
- int leftlistnum, rightlistnum;
- Widget leftlist, rightlist ,leftlabel, rightlabel, leftdirtext, rightdirtext;
- int rename_popups;
- char *command_string;
- long int size;
- char *xbrowserpath;
-
- int compare(ptr1, ptr2)
- void *ptr1, *ptr2;
- {
- return( strcmp( ((struct Entry *)*(struct Entry **)ptr1)->name, ((struct Entry *)*(struct Entry **)ptr2)->name ));
- }
-
-
- void set_label(w, str)
- Widget w;
- char *str;
- {
- int ac;
- Arg al[2];
- XmString label_label;
-
- ac = 0;
- label_label = XmStringCreateLtoR(str, XmSTRING_DEFAULT_CHARSET);
- XtSetArg(al[ac], XmNlabelType, XmSTRING); ac++;
- XtSetArg(al[ac], XmNlabelString, label_label); ac++;
- XtSetValues(w, al, ac);
- XmUpdateDisplay(w);
- }
-
- void displayerror(t, side)
- char *t;
- int side;
- {
-
- if (side == LEFT)
- set_label(leftinfolabel, t);
- else
- set_label(rightinfolabel, t);
-
- }
-
- void add_size(ptr)
- struct Entry *ptr;
- {
- size = size + ptr->size;
- }
-
-
-
- void display_info(side)
- int side;
- {
- int *sellist;
- int numsel, n;
- char line[255];
-
- numsel = 0;
- size = 0;
- if (side == LEFT)
- {
- numsel = foreachleft(add_size);
- sprintf(line, "%d selected, %d bytes", numsel, size);
- set_label(leftinfolabel, line);
- }
- else
- {
- numsel = foreachright(add_size);
- sprintf(line, "%d selected, %d bytes", numsel, size);
- set_label(rightinfolabel, line);
- }
-
- }
-
- int dir_list(list, dir, ptrs)
- /* ** read a dir from 'dir' string and set the list contents in widget 'list **/
- Widget list;
- char *dir;
- struct Entry *ptrs[];
- {
- Arg al[10];
- int ac;
- DIR *dirl;
- struct dirent *dent;
- XmString item_array[DIRSIZE];
- int items,loop, side, n;
- struct stat buf;
- char info_line[255];
- char p[10];
- mode_t mode;
-
- if (list == leftlist)
- side = LEFT;
- else
- side = RIGHT;
-
- dirl = opendir(dir);
- if (dirl == NULL)
- {
- displayerror("can't open dir", side);
- return(0);
- }
-
- if (side == LEFT)
- {
- for (n=0; n < leftlistnum; n++)
- free(ptrs[n]);
- }
- else
- {
- for (n=0; n < rightlistnum; n++)
- free(ptrs[n]);
- }
- items = 0;
- for ( dent = readdir(dirl); dent != NULL ; dent = readdir(dirl) )
- {
- char path[MAXNAMLEN];
-
- sprintf(path, "%s/%s", dir, dent->d_name);
- stat(path, &buf);
-
- ptrs[items] = (struct Entry *)malloc(sizeof(struct Entry));
- ptrs[items]->dir = S_ISDIR(buf.st_mode);
- ptrs[items]->size = buf.st_size;
- ptrs[items]->mode = buf.st_mode;
- ptrs[items]->name = STRING(dent->d_name);
- ptrs[items]->path = STRING(dir);
- ptrs[items]->fullname = XtMalloc(strlen(dir)+strlen(dent->d_name)+2);
- sprintf(ptrs[items]->fullname, "%s/%s", dir, dent->d_name);
- items++;
- }
-
- closedir(dirl);
-
- qsort(ptrs, items, sizeof(struct Entry *), compare);
-
- for (loop=0; loop < items; loop++)
- {
- char t;
-
- t = ' ';
- if (ptrs[loop]->dir)
- t='/';
- else
- if (ptrs[loop]->mode & S_IXUSR)
- t = '*';
- mode = ptrs[loop]->mode;
- strcpy(p, "----------");
- if (ptrs[loop]->dir)
- p[0] = 'd';
- if (mode & S_IRUSR)
- p[1] = 'r';
- if (mode & S_IWUSR)
- p[2] = 'w';
- if (mode & S_IXUSR)
- p[3] = 'x';
- if (mode & S_IRGRP)
- p[4] = 'r';
- if (mode & S_IWGRP)
- p[5] = 'w';
- if (mode & S_IXGRP)
- p[6] = 'x';
- if (mode & S_IROTH)
- p[7] = 'r';
- if (mode & S_IWOTH)
- p[8] = 'w';
- if (mode & S_IXOTH)
- p[9] = 'x';
-
- sprintf(info_line, " %s %8d %s%c", p, ptrs[loop]->size, ptrs[loop]->name, t);
- item_array[loop] = (XmString)XmStringCreateLtoR(info_line, XmSTRING_DEFAULT_CHARSET);
- }
-
- ac = 0;
- XtSetArg(al[ac], XmNitems, (XtArgVal)item_array); ac++;
- XtSetArg(al[ac], XmNitemCount, (XtArgVal)items); ac++;
- XtSetValues(list, al, ac);
- XmListDeselectAllItems(list);
- displayerror("OK.", side);
- return(items);
- }
-
- void read_left()
- {
- set_label(leftinfolabel, "Reading directory...");
- leftlistnum = dir_list(leftlist, leftcd, leftptrs);
- }
-
- void read_right()
- {
- set_label(rightinfolabel, "Reading directory...");
- rightlistnum = dir_list(rightlist, rightcd, rightptrs);
- }
-
- void do_left()
- {
- getwd(leftcd);
- XmTextSetString(leftdirtext, leftcd);
- read_left();
- }
-
- void do_right()
- {
- getwd(rightcd);
- XmTextSetString(rightdirtext, rightcd);
- read_right();
- }
-
- void init()
- {
- do_left();
- do_right();
- }
-
-
-
- void newleftdir()
- {
- strcpy(leftcd, XmTextGetString(leftdirtext));
- read_left();
- }
-
- void newrightdir()
- {
- strcpy(rightcd, XmTextGetString(rightdirtext));
- read_right();
- }
-
-
-
- void sys(com)
- char *com;
- {
- fprintf(stdout, "%s\n", com);
- system(com);
- if (readaftercommand)
- {
- read_left();
- read_right();
- }
-
- }
-
-
-
-
-
- void killpop(w, c1, c2)
- Widget w;
- {
- XtUnmanageChild(w);
- XtDestroyWidget(w);
- }
-
-
- static XtCallbackRec call_kill[] = { {(XtCallbackProc)killpop, (caddr_t)NULL},
- { (XtCallbackProc)NULL, (caddr_t)NULL} };
-
-
-
- void string_popup(title, info, initstr, callback, entry)
- char *title, *info, *initstr;
- XtCallbackProc callback;
- struct Entry *entry;
- {
- Widget pop, stringtext, outer, rc, label;
- Arg al[10];
- int ac;
- FILE *fp = NULL;
- Widget okbutton, cancelbutton, cancelallbutton;
-
-
- ac = 0;
- XtSetArg(al[ac], XmNdialogStyle, XmDIALOG_APPLICATION_MODAL); ac++;
- XtSetArg(al[ac], XmNselectionLabelString, XmStringCreate(info, XmSTRING_DEFAULT_CHARSET) ); ac++;
- XtSetArg(al[ac], XmNtextString, XmStringCreate(initstr, XmSTRING_DEFAULT_CHARSET) ); ac++;
- pop = XmCreatePromptDialog(toplevel, "stringpopup", al, ac);
- outer = XtParent(pop);
-
- ac = 0;
- XtSetArg(al[ac], XmNunmapCallback, call_kill); ac++;
- XtSetValues(outer, al, ac);
-
- stringtext = XmSelectionBoxGetChild(pop, XmDIALOG_TEXT );
-
- okbutton = XmSelectionBoxGetChild(pop, XmDIALOG_OK_BUTTON);
- cancelbutton = XmSelectionBoxGetChild(pop, XmDIALOG_CANCEL_BUTTON);
-
- XtUnmanageChild(XmSelectionBoxGetChild(pop, XmDIALOG_HELP_BUTTON) );
-
- XtAddCallback(pop, XmNokCallback, callback, (XtPointer)entry);
- XtAddCallback(pop, XmNcancelCallback, callback, (XtPointer)entry);
-
- XtUnmanageChild(XmSelectionBoxGetChild(pop, XmDIALOG_SEPARATOR ) );
-
- ac = 0;
- XtSetArg (al[ac], XmNtitle, title); ac++;
- XtSetValues(outer, al, ac);
-
- XtManageChild(pop);
- }
-
-
- void view_window(str, title)
- char *str;
- char *title;
- {
- Widget pop, textwindow, outer;
- Arg al[10];
- int ac;
- ac = 0;
- XtSetArg(al[ac], XmNokLabelString, XmStringCreate("Close", XmSTRING_DEFAULT_CHARSET) ); ac++;
- pop = XmCreatePromptDialog(toplevel, "textpopup", al, ac);
- outer = XtParent(pop);
-
- ac = 0;
- XtSetArg(al[ac], XmNunmapCallback, call_kill); ac++;
- XtSetValues(outer, al, ac);
-
- XtUnmanageChild(XmSelectionBoxGetChild(pop, XmDIALOG_SELECTION_LABEL) );
- XtUnmanageChild(XmSelectionBoxGetChild(pop, XmDIALOG_TEXT ) );
- XtUnmanageChild(XmSelectionBoxGetChild(pop, XmDIALOG_SEPARATOR ) );
- XtUnmanageChild(XmSelectionBoxGetChild(pop, XmDIALOG_APPLY_BUTTON) );
- XtUnmanageChild(XmSelectionBoxGetChild(pop, XmDIALOG_CANCEL_BUTTON) );
- XtUnmanageChild(XmSelectionBoxGetChild(pop, XmDIALOG_HELP_BUTTON) );
-
-
- ac = 0;
-
- XtSetArg(al[ac], XmNeditMode, XmMULTI_LINE_EDIT); ac++;
- XtSetArg(al[ac], XmNscrollLeftSide, TRUE); ac++;
- textwindow = XmCreateScrolledText(pop, "textwindow", al, ac);
- XtManageChild(textwindow);
-
- ac = 0;
- XtSetArg (al[ac], XmNtitle, title); ac++;
- XtSetValues(outer, al, ac);
-
- XmTextSetString(textwindow, str);
- XmUpdateDisplay(textwindow);
- XtManageChild(pop);
- }
-
-
- void text_popup(filename)
- char *filename;
- {
-
- FILE *fp = NULL;
- int file_length;
- char * file_string;
- struct stat statbuf;
-
-
- /** load the file **/
-
- if ((fp = fopen(filename, "r")) == NULL)
- {
- char line[255];
-
- sprintf(line, "can't open file %s for viewing\n", filename);
- fprintf(stderr, line);
- return;
- }
-
-
- if (stat(filename, &statbuf) == 0)
- file_length = statbuf.st_size;
- file_string = (char *) XtMalloc((unsigned)file_length+1);
- file_string[file_length]='\0';
- fread(file_string, sizeof(char), file_length, fp);
- if (fclose(fp) != NULL)
- fprintf(stdout, "%s\n", "Warning: unable to close file.");
-
- view_window(file_string, filename);
- XtFree(file_string);
-
-
- }
-
-
- char *dumporama(file)
- char* file;
- {
- struct stat statbuf;
- char ch,str[17];
- char line[80];
- char hex[4];
- char* massivebuf;
- char* massiveptr;
- int i,count=0,offset=(-16);
- int fd;
- int wanted;
-
- str[16]='\0';
- if ((fd=open(file,O_RDONLY,0))==-1) {
- fprintf(stderr,"cannot open %s\n",file);
- return(NULL);
- }
- if (fstat(fd,&statbuf))
- {
- fprintf(stderr,"cannot stat file\n");
- return(NULL);
- }
- wanted=(statbuf.st_size)*75+1;
- massiveptr=massivebuf=(char*)malloc(wanted);
- if (!massivebuf)
- {
- fprintf(stderr,"cannot malloc %d bytes\n",wanted);
- return(NULL);
- }
- sprintf(line,"%6X: ",offset+=16);
- while (read(fd,&ch,1)>0)
- {
- ch=(int)ch&0xff;
- str[count++]=((ch>31 && ch<127)?ch:'.');
- sprintf(hex,"%2.2X ",(int) ch&0xff);
- strcat(line,hex);
- if (count==16)
- {
- count=0;
- strcat(line,": ");
- strcat(line,str);
- sprintf(massiveptr,"%s\n",line);
- massiveptr+=strlen(line)+1;
- sprintf(line,"%6X: ",offset+=16);
- }
- }
- sprintf(massiveptr,"%s",line);
- massiveptr+=strlen(line);
- close(fd);
- if (count>0) for (i=count;i<16;i++)
- {
- sprintf(massiveptr,(i!=15)?"-- ":"-- : ");
- massiveptr+=(i!=15)?3:5;
- }
- i=count;
- while (count>0)
- {
- sprintf(massiveptr,count==0?"%c\n":"%c",str[i-count--]);
- massiveptr+=count==0?2:1;
- }
- return(massivebuf);
- }
-
-
-
- void hex_popup(filename)
- char *filename;
- {
- char *string;
-
- string = dumporama(filename);
- if (string != NULL)
- {
- view_window(string, filename);
- free(string);
- }
- }
-
- executeCB(w, c1, calldata)
- Widget w;
- caddr_t c1;
- caddr_t calldata;
- {
- char *param;
- XmSelectionBoxCallbackStruct *call;
- char *line;
- char *command = (char*)c1;
-
- call = (XmSelectionBoxCallbackStruct *)calldata;
- if (call->reason != XmCR_CANCEL)
- {
- XmStringGetLtoR(call->value, XmSTRING_DEFAULT_CHARSET, ¶m);
- line = XtMalloc(strlen(command) + strlen(param) + 1);
- sprintf(line, command, param);
- sys(line);
- XtFree(line);
- }
- }
-
- void execute(command)
- char *command;
- {
- int len = strlen(command);
- char *newcmd = malloc(len+1);
- char *promptstring = malloc(len+1);
- char *titlestring = malloc(len+1);
- int newptr = 0;
- int callbackused;
- int tit = 0;
- int pit = 0;
- int n;
- Boolean popupneeded = FALSE;
-
- for (n=0; n< len; n++)
- {
- if (command[n] == '^')
- {
- popupneeded = TRUE;
- while (command[++n] != '@')
- titlestring[tit++] = command[n];
- titlestring[tit] = '\0';
- while (command[++n] != '^')
- promptstring[pit++] = command[n];
- promptstring[pit] = '\0';
- n++;
- newcmd[newptr++] = '%';
- newcmd[newptr++] = 's';
- }
- newcmd[newptr++] = command[n];
- }
- newcmd[newptr] = '\0';
-
- if (popupneeded)
- string_popup(titlestring, promptstring, "", executeCB, newcmd);
- else
- sys(command);
- }
-
- void renameCB(w, c1, calldata)
- Widget w;
- caddr_t c1;
- caddr_t calldata;
- {
- char *newname;
- XmSelectionBoxCallbackStruct *call;
- char newpath[255];
- struct Entry *e;
-
- e=(struct Entry *)c1;
-
- call = (XmSelectionBoxCallbackStruct *)calldata;
-
- if (call->reason != XmCR_CANCEL)
- {
- XmStringGetLtoR(call->value, XmSTRING_DEFAULT_CHARSET, &newname);
- sprintf(newpath, "%s/%s", e->path, newname);
- if (rename(e->fullname, newpath) !=0)
- fprintf(stderr, "Error: rename %s %s failed.\n", e->fullname, newpath);
- }
-
- rename_popups--;
- if (rename_popups == 0) /** reread the dir after all the popups have gone **/
- {
- read_left();
- read_right();
- }
-
- }
-
- int foreachleft(func)
- int (*func)();
- {
- int *sellist;
- int numsel, n;
-
- if (XmListGetSelectedPos(leftlist, &sellist, &numsel) )
- for (n = 0; n < numsel; n++)
- (*func)(leftptrs[sellist[n]-1]);
- else
- numsel = 0;
- return(numsel);
- }
-
- int foreachright(func)
- int (*func)();
- {
- int *sellist;
- int numsel, n;
-
- if (XmListGetSelectedPos(rightlist, &sellist, &numsel) )
- for (n = 0; n < numsel; n++)
- (*func)(rightptrs[sellist[n]-1]);
- else
- numsel = 0;
- return(numsel);
-
- }
-
- int foreachselected(func)
- int (*func)();
- {
- return(foreachleft(func) + foreachright(func));
- }
-
-
- int rename_one_file(ent)
- struct Entry *ent;
- {
- char *tstr;
- static char text[]="Enter new name for : ";
-
- printf("rename %s\n", ent->name);
- tstr = XtMalloc(strlen(text) + strlen(ent->fullname) +2);
- sprintf(tstr, "%s%s", text, ent->fullname );
- string_popup("Rename", tstr, ent->name, (XtCallbackProc)renameCB, ent);
- rename_popups++;
- XtFree(tstr);
- }
-
-
- void ren(w, c1, c2)
- /** rename the selected files **/
- Widget w;
- caddr_t c1, c2;
- {
- rename_popups = 0;
- foreachselected(rename_one_file);
- }
-
-
- void view_one_file(ptr)
- struct Entry *ptr;
- {
- text_popup(ptr->fullname);
- }
-
-
- void view(w, c1, c2)
- /** view the selected files **/
- Widget w;
- caddr_t c1;
- caddr_t c2;
- {
- foreachselected(view_one_file);
- }
-
- void hex_view_one_file(ptr)
- struct Entry *ptr;
- {
- hex_popup(ptr->fullname);
- }
-
- void hex_view(w, c1, c2)
- /** view the selected files **/
- Widget w;
- caddr_t c1;
- caddr_t c2;
- {
- foreachselected(hex_view_one_file);
- }
-
-
- void do_each_one(ptr)
- struct Entry *ptr;
- {
- char line[255];
-
- sprintf(line, command_string, ptr->fullname);
- execute(line);
- }
-
-
- void do_each(command, rereaddir)
- /** execute the command for each file that is selected **/
- char *command;
- Boolean rereaddir;
- {
- int *sellist;
- int numsel, n;
- char line[255], path[255];
-
- command_string = command;
- readaftercommand = rereaddir;
- foreachselected(do_each_one);
- }
-
- void do_sourcedest(command, rereaddir)
- char *command;
- Boolean rereaddir;
- {
- char *string;
- int *sellist;
- int numsel, n, len;
- char *tptr, *fname;
- char *line;
-
- string = NULL;
- chdir(leftcd);
- readaftercommand = rereaddir;
-
- if (XmListGetSelectedPos(leftlist, &sellist, &numsel) )
- {
- for (n = 0; n < numsel; n++)
- {
- fname = leftptrs[sellist[n]-1]->name;
- len = strlen(fname);
- if (strcmp(fname, "..") && strcmp(fname, "."))
- {
- if (string == NULL)
- {
- string = XtMalloc(len+2);
- sprintf(string, "%s ", fname);
- }
- else
- {
- tptr = XtMalloc(strlen(string)+len+2);
- sprintf(tptr, "%s ", string);
- strcat(tptr, fname);
- XtFree(string);
- string = tptr;
- }
- }
- }
- printf("source dest = \"%s\"\n", string);
- line = XtMalloc(strlen(string)+strlen(command)+strlen(rightcd));
- sprintf(line,command, string, rightcd);
- execute(line);
- XtFree(line);
- XtFree(string);
-
- /** if (rereaddir)
- {
- newleftdir();
- newrightdir();
- }
- **/
- display_info(LEFT);
- display_info(RIGHT);
-
- }
-
-
- }
-
- void assemble_str(ptr)
- struct Entry *ptr;
- {
- char *nstr;
- char *t;
-
- if (astring == NULL)
- astring = strcpy(XtMalloc(strlen(ptr->fullname)+1),ptr->fullname);
-
- else
-
- {
- nstr = XtMalloc(strlen(ptr->fullname) + 2);
- sprintf(nstr, " %s", ptr->fullname);
- t = XtMalloc(strlen(nstr) + strlen(astring) + 1);
- strcpy(t, astring);
- strcat(t, nstr);
- XtFree(astring);
- astring = t;
- XtFree(nstr);
- }
- }
-
-
-
- void do_allpath(command, rereaddir)
- /** execute a single command with each file that is selected **/
- char *command;
- Boolean rereaddir;
- {
- char *s;
-
- if (astring != NULL)
- {
- XtFree(astring);
- astring = NULL;
- }
- readaftercommand = rereaddir;
- if (foreachselected(assemble_str))
- {
- s = XtMalloc(strlen(command) + strlen(astring) + 2);
- sprintf(s, command, astring);
- execute(s);
- XtFree(s);
- }
- }
-
-
- void do_all(command, rereaddir)
- /** execute a single command with each file that is selected **/
- char *command;
- Boolean rereaddir;
- {
-
- int *sellist;
- int numsel;
- char *line;
- int len, n;
- char *string, *fname;
- char *tptr, path[255];
- char fullname[255];
-
- string = NULL;
- chdir(leftcd);
-
- readaftercommand = rereaddir;
-
- if (XmListGetSelectedPos(leftlist, &sellist, &numsel) )
- {
- for (n = 0; n < numsel; n++)
- {
- fname = leftptrs[sellist[n]-1]->name;
- sprintf(fullname, "%s/%s", path, fname);
- len = strlen(fname);
- if (string == NULL)
- {
- string = XtMalloc(len);
- sprintf(string, "%s", fname);
- }
- else
- {
- tptr = XtMalloc(strlen(string)+len+2);
- sprintf(tptr, "%s ", string);
- strcat(tptr, fname);
- XtFree(string);
- string = tptr;
- }
- }
- }
-
-
- if (XmListGetSelectedPos(rightlist, &sellist, &numsel) )
- {
- if (strcmp(leftcd, rightcd))
- {
- if (string!=NULL) /** execute the command if there is one **/
- {
- line = XtMalloc(strlen(string) + strlen(command) + 2);
- sprintf(line, command, string);
- execute(line);
- }
- chdir(rightcd);
- *path = '\0';
- XtFree(string);
- string = NULL;
- }
-
-
- strcpy(path, rightcd);
-
- for (n = 0; n < numsel; n++)
- {
- fname = rightptrs[sellist[n]-1]->name;
- if (!(*path!='\0'))
- sprintf(fullname, "%s/%s", path, fname);
- else
- sprintf(fullname, "%s", fname);
-
- len = strlen(fullname);
- if (string == NULL)
- {
- string = XtMalloc(len+2);
- sprintf(string, " %s", fullname); /** this space should not be in the string! */
- }
- else
- {
- tptr = XtMalloc(strlen(string)+len+2);
- sprintf(tptr, "%s ", string);
- strcat(tptr, fullname);
- XtFree(string);
- string = tptr;
- }
- }
- }
-
- if (string == NULL)
- return;
-
- line = XtMalloc(strlen(string) + strlen(command) + 2);
- sprintf(line, command, string);
- execute(line);
- XtFree(line);
-
- XtFree(string);
-
- }
-
- void prog_button(w, c1, c2)
- /** a user defined button has been pressed **/
- Widget w;
- caddr_t c1;
- caddr_t c2;
- {
- int b, context;
- char *str;
- Boolean reread;
-
- b = (int)c1;
- context = buttonlist[b]->context;
- str = buttonlist[b]->command;
- reread = buttonlist[b]->reread;
-
- switch (context)
- {
- case BCOMMAND: readaftercommand = reread; execute(str); break;
- case BEACH: do_each(str, reread); break;
- case BALL: do_all(str, reread); break;
- case BALLPATH: do_allpath(str, reread); break;
- case BSOURCEDEST: do_sourcedest(str, reread); break;
- }
- }
-
- void do_magic_file(m, name)
- int m;
- char *name;
- {
- char command[255];
-
- if (*magiclist[m]->mstring == '*')
- {
- if (!strcmp(magiclist[m]->mstring, "*view") )
- text_popup(name);
- if (!strcmp(magiclist[m]->mstring, "*hex") )
- hex_popup(name);
- }
- else
- {
- readaftercommand = magiclist[m]->mreread;
- sprintf(command, magiclist[m]->mstring, name);
- execute(command);
- }
- }
-
- void selection(w, side, c2)
- /** a list item was selected by a single click **/
- Widget w;
- caddr_t side;
- caddr_t c2;
- {
- int s;
- s = (int)side;
- display_info(s);
- if (side ==LEFT)
- chdir(leftcd);
- else
- chdir(rightcd);
- }
-
-
- void dc_selection(w, side, c2)
- Widget w;
- caddr_t side;
- caddr_t c2;
- {
- /** a list item was selected by a double click **/
- int pos;
- XmListCallbackStruct *cb = (XmListCallbackStruct *)c2;
- char *fname, *path, *fullname;
- int n, fmode;
- Boolean fdir;
-
- pos = (cb->item_position) - 1;
-
- if ((int)side == LEFT)
- {
- fname = leftptrs[pos]->name;
- fdir = leftptrs[pos]->dir;
- fmode = leftptrs[pos]->mode;
- fullname = leftptrs[pos]->fullname;
- path = leftcd;
- }
- else
- {
- fname = rightptrs[pos]->name;
- fdir = rightptrs[pos]->dir;
- fmode = rightptrs[pos]->mode;
- fullname = rightptrs[pos]->fullname;
- path = rightcd;
- }
-
- /** if the file is a dir then attempt to change **/
- if (fdir)
- {
- if (chdir(fullname) != 0)
- displayerror("can't change dir!\n", (int)side );
- else
- {
- if ((int)side == RIGHT)
- do_right();
- else
- do_left();
- }
- }
- else
- {
- for (n=0; n<num_magic; n++)
- {
- if ((magiclist[n]->mtype == MFILE) && (!strcmp(fname, magiclist[n]->mname)) )
- do_magic_file(n, fullname);
- }
-
- for (n=0; n<num_magic; n++)
- {
- char *cf;
- cf = fname + strlen(fname)-strlen(magiclist[n]->mname);
-
- if ((magiclist[n]->mtype == MSUFFIX) && (!strcmp(cf, magiclist[n]->mname)) )
- do_magic_file(n, fullname);
- }
-
- if (fmode & S_IXUSR) /**execute it if it has execute permission **/
- {
- char *line;
-
- line = XtMalloc(strlen(fullname)+3);
- sprintf(line, "%s &", fullname);
- execute(line);
- XtFree(line);
- }
-
- }
- }
-
- void get_magic()
- {
- FILE *mfile;
- char mtype[255], mname[255], mreread[255], mstring[255];
- int mline;
- char *m;
- char magic_path[255];
-
-
- sprintf(magic_path, "%s/%s", xbrowserpath, MAGIC_FILE);
-
- num_magic = 0;
- mline = 0;
- if (!(mfile = fopen(magic_path, "r")))
- {
- fprintf(stderr, "can't open magic file %s.\n", magic_path);
- return;
- }
-
- while (1)
- {
- if (fscanf(mfile, "%s%s%s %[ ]" , mtype, mname, mreread) == -1)
- break;
- if (fgets(mstring, 255, mfile) == NULL)
- {
- fprintf(stderr, "error in magic file line:%d\n",mline);
- break;
- }
- else
- mstring[strlen(mstring)-1] = '\0'; /** clear return chr **/
-
- if (mtype[0] != '#')
- {
- if (debug)
- fprintf(stdout, "mclass = %s \t mstring = %s \t\t mcommand = %s\n",mtype, mname, mstring);
- magiclist[num_magic] = (struct Magic *)malloc(sizeof(struct Magic));
- if (!strcmp("file", mtype))
- magiclist[num_magic]->mtype = MFILE;
- else
- if (!strcmp("suffix", mtype))
- magiclist[num_magic]->mtype = MSUFFIX;
- else
- fprintf(stderr, "unknown magic type line:%d\n", mline);
-
- magiclist[num_magic]->mname = STRING(mname);
- magiclist[num_magic]->mstring = STRING(mstring);
- if (*mreread == 'y' || *mreread == 'Y')
- magiclist[num_magic]->mreread = TRUE;
- else
- if (*mreread == 'n' || *mreread == 'N')
- magiclist[num_magic]->mreread = FALSE;
- else
- fprintf(stderr, "error in magic file (rereaddir) line:%d\n",mline);
-
- num_magic++;
- }
-
- mline++;
- }
- fclose(mfile);
- if (debug)
- fprintf(stdout, "\n\nMagic file read, %d lines, %d magic classes\n\n\n", mline+1, num_magic);
- }
-
-
- void get_buttons(parent)
- Widget parent;
- {
- FILE *mfile;
- char mcontext[255], mname[255], mreread[255], mstring[255], button_label[255];
- int mline;
- Widget w;
- Boolean make_button;
- Arg al[10];
- int ac;
- char button_path[255];
-
- num_buttons = 0;
- mline = 0;
- sprintf(button_path, "%s/%s", xbrowserpath, BUTTONS_FILE);
-
- if (!(mfile = fopen(button_path, "r")))
- {
- fprintf(stderr, "can't open buttons file %s.\n", button_path);
- return;
- }
-
- while (1)
- {
- if (fscanf(mfile, "%s %s%s %[ ]" , mname, mcontext, mreread) == -1)
- break;
- if (fgets(mstring, 255, mfile) == NULL)
- {
- fprintf(stderr, "error in button file line:%d\n",mline);
- break;
- }
- else
- mstring[strlen(mstring)-1] = '\0'; /** clear return chr **/
-
- if (mname[0] != '#')
- {
- make_button = TRUE;
- if (debug)
- fprintf(stdout, "bname = %s \t bcontext = %s \t bstring = %s\n",mname, mcontext, mstring);
- buttonlist[num_buttons] = (struct Button *)malloc(sizeof(struct Button));
- if (!strcmp("all", mcontext))
- buttonlist[num_buttons]->context = BALL;
- else
- if (!strcmp("allpath", mcontext))
- buttonlist[num_buttons]->context = BALLPATH;
- else
- if (!strcmp("each", mcontext))
- buttonlist[num_buttons]->context = BEACH;
- else
- if (!strcmp("command", mcontext))
- buttonlist[num_buttons]->context = BCOMMAND;
- else
- if (!strcmp("sourcedest", mcontext))
- buttonlist[num_buttons]->context = BSOURCEDEST;
- else
- {
- fprintf(stderr, "unknown button context line:%d\n", mline);
- make_button = FALSE;
- }
-
- if (*mreread == 'y' || *mreread == 'Y')
- buttonlist[num_buttons]->reread = TRUE;
- else
- if (*mreread == 'n' || *mreread == 'N')
- buttonlist[num_buttons]->reread = FALSE;
- else
- {
- fprintf(stderr, "error in buttons file (rereaddir) line:%d\n",mline);
- make_button = FALSE;
- }
-
- if (make_button)
- {
- buttonlist[num_buttons]->command = STRING(mstring);
- ac = 0;
- XtSetArg(al[ac], XmNlabelString, XmStringCreate(mname, XmSTRING_DEFAULT_CHARSET) ); ac++;
- w = XtCreateManagedWidget("button", xmPushButtonWidgetClass, parent, al, ac);
- XtAddCallback(w, XmNactivateCallback, prog_button, (XtPointer)num_buttons);
- num_buttons++;
- }
- }
-
- mline++;
- }
- fclose(mfile);
-
- if (debug)
- fprintf(stdout, "\n\nButton file read, %d lines, %d buttons\n\n\n", mline+1, num_buttons);
- }
-
- void quit(w, c1, c2)
- Widget w;
- caddr_t c1;
- caddr_t c2;
- {
- fprintf(stdout, "Bye!\n");
- exit(0);
- }
-
- void select_all(w, side, c2)
- Widget w;
- caddr_t side;
- caddr_t c2;
- {
- Widget list;
- int n, maxi;
-
- if ( (int)side == LEFT)
- {
- maxi = leftlistnum;
- list = leftlist;
- }
- else
- {
- list = rightlist;
- maxi = rightlistnum;
- }
- XmListDeselectAllItems(list);
- for (n = 1; n <=maxi; n++)
- XmListSelectPos(list, n, FALSE);
- display_info((int)side);
- }
-
- void select_files(w, side, c2)
- Widget w;
- caddr_t side;
- caddr_t c2;
- {
- Widget list;
- int n, maxi;
- struct Entry *(*ptrs);
-
- if ( (int)side == LEFT)
- {
- maxi = leftlistnum;
- list = leftlist;
- ptrs = leftptrs;
- }
- else
- {
- list = rightlist;
- maxi = rightlistnum;
- ptrs = rightptrs;
- }
- XmListDeselectAllItems(list);
- for (n = 1; n <=maxi; n++)
- if (!ptrs[n-1]->dir)
- XmListSelectPos(list, n, FALSE);
- display_info((int)side);
- }
-
- void invert_all(w, side, c2)
- Widget w;
- caddr_t side;
- caddr_t c2;
- {
- Widget list;
- int n, maxi;
-
- if ( (int)side == LEFT)
- {
- maxi = leftlistnum;
- list = leftlist;
- }
- else
- {
- list = rightlist;
- maxi = rightlistnum;
- }
-
- for (n = 1; n <=maxi; n++)
- XmListSelectPos(list, n, FALSE);
- display_info((int)side);
- }
-
- void clear_all(w, side, c2)
- Widget w;
- caddr_t side;
- caddr_t c2;
- {
- Widget list;
-
- if ( (int)side == LEFT)
- list = leftlist;
- else
- list = rightlist;
- XmListDeselectAllItems(list);
- display_info((int)side);
- }
-
-
- void newdir(w, side, c2)
- Widget w;
- caddr_t side;
- caddr_t c2;
- {
- int s;
- s = (int)side;
- if (side == LEFT)
- newleftdir();
- else
- newrightdir();
-
- }
-
-
- Widget make_side(side, title, parentform, dirtext, list, label)
- int side;
- char *title;
- Widget parentform;
- Widget *dirtext;
- Widget *list;
- Widget *label;
- {
- Widget sidef, sideform, sidelabel, sidedirtext, sidelist, siderc, w;
- Arg al[10];
- int ac;
-
- ac = 0;
- XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
- sidef = XtCreateManagedWidget("sideform", xmFormWidgetClass, parentform, al, ac);
-
- ac = 0;
- XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
- sideform = XtCreateManagedWidget("sideform", xmFormWidgetClass, sidef, al, ac);
-
- ac = 0;
- XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
- sidelabel = XtCreateManagedWidget(title, xmLabelWidgetClass, sideform, al, ac);
-
- ac = 0;
- XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
- XtSetArg(al[ac], XmNtopWidget, sidelabel); ac++;
- XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
- sidedirtext = XtCreateManagedWidget("sidedir", xmTextWidgetClass, sideform, al, ac);
- XtAddCallback(sidedirtext, XmNactivateCallback, (XtCallbackProc)newdir, (XtPointer)side);
-
-
- ac = 0;
- XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
- XtSetArg(al[ac], XmNtopWidget, sidedirtext); ac++;
- XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNselectionPolicy, XmMULTIPLE_SELECT); ac++;
-
- sidelist = XmCreateScrolledList(sideform, "sidelist", al, ac);
- XtAddCallback(sidelist, XmNmultipleSelectionCallback, selection, (XtPointer)side);
- XtAddCallback(sidelist, XmNdefaultActionCallback, dc_selection, (XtPointer)side);
- XtManageChild(sidelist);
-
- ac = 0;
- XtSetArg(al[ac], XmNentryAlignment, XmALIGNMENT_CENTER); ac++;
- XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
- XtSetArg(al[ac], XmNpacking, XmPACK_COLUMN); ac++;
- siderc = XtCreateManagedWidget("siderc", xmRowColumnWidgetClass, sidef, al, ac);
-
- ac = 0;
- XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
- XtSetArg(al[ac], XmNbottomWidget, siderc); ac++;
- XtSetValues(sideform, al, ac);
-
-
- ac = 0;
- w = XtCreateManagedWidget("All", xmPushButtonWidgetClass, siderc, al, ac);
- XtAddCallback(w, XmNactivateCallback, select_all, (XtPointer)side);
- w = XtCreateManagedWidget("Clear", xmPushButtonWidgetClass, siderc, al, ac);
- XtAddCallback(w, XmNactivateCallback, clear_all, (XtPointer)side);
- w = XtCreateManagedWidget("Files", xmPushButtonWidgetClass, siderc, al, ac);
- XtAddCallback(w, XmNactivateCallback, select_files, (XtPointer)side);
- w = XtCreateManagedWidget("Invert", xmPushButtonWidgetClass, siderc, al, ac);
- XtAddCallback(w, XmNactivateCallback, invert_all, (XtPointer)side);
-
- ac = 0;
- XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNmarginLeft, 10); ac++;
- XtSetArg(al[ac], XmNmarginHeight, 4); ac++;
- XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
- sidelabel = XtCreateManagedWidget("sidelabel", xmLabelWidgetClass, sidef, al, ac);
-
- ac = 0;
- XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
- XtSetArg(al[ac], XmNbottomWidget, sidelabel); ac++;
- XtSetValues(siderc, al, ac);
-
- *dirtext = sidedirtext;
- *list = sidelist;
- *label = sidelabel;
-
- return(sidef);
- }
-
-
- main(argc, argv)
- int argc;
- char *argv[];
- {
- Widget topform, topformframe, w, mainform, mainlabel;
- Widget leftform, rightform, buttonrc, buttonrcframe;
- XtAppContext app_con;
-
-
- Arg al[10];
- int ac;
-
- toplevel = XtAppInitialize(&app_con, "Xbrowser", NULL, 0,
- &argc, argv, fallback_resources, NULL, 0);
-
- if ( (argc == 2) && (!strcmp(argv[1], "-debug") ) )
- debug = TRUE;
- else
- debug = FALSE;
-
- if (debug)
- printf("xbrowser path = %s\n", getenv("XBROWSER") );
- xbrowserpath = getenv("XBROWSER");
- if (xbrowserpath == NULL)
- xbrowserpath = STRING(".");
- get_magic();
-
- ac = 0;
- mainform = XtCreateManagedWidget("mainform", xmFormWidgetClass, toplevel, al, ac);
-
- ac = 0;
- XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNmarginHeight, 5); ac++;
- XtSetArg(al[ac], XmNlabelString,
- XmStringCreate(VERSIONSTRING, XmSTRING_DEFAULT_CHARSET)); ac++;
- mainlabel = XtCreateManagedWidget("title", xmLabelWidgetClass, mainform, al, ac);
-
- ac = 0;
- XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
- XtSetArg(al[ac], XmNtopWidget, mainlabel); ac++;
- XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNshadowType, XmSHADOW_OUT); ac++;
- topformframe = XtCreateManagedWidget("topformframe", xmFrameWidgetClass, mainform, al, ac);
-
- ac = 0;
- topform = XtCreateManagedWidget("topform", xmFormWidgetClass, topformframe, al, ac);
-
- leftform = make_side(LEFT, "Source:", topform, &leftdirtext, &leftlist, &leftinfolabel);
- rightform = make_side(RIGHT, "Destination:", topform, &rightdirtext, &rightlist, &rightinfolabel);
-
- /** button strip frame**/
- ac = 0;
- XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
- XtSetArg(al[ac], XmNshadowType, XmSHADOW_OUT); ac++;
- buttonrcframe = XtCreateManagedWidget("buttonstripframe", xmFrameWidgetClass, topform, al, ac);
-
- /** button strip **/
- ac = 0;
- XtSetArg(al[ac], XmNorientation, XmHORIZONTAL); ac++;
- XtSetArg(al[ac], XmNentryAlignment, XmALIGNMENT_CENTER); ac++;
- buttonrc = XtCreateManagedWidget("buttonstrip", xmRowColumnWidgetClass, buttonrcframe, al, ac);
-
- ac = 0;
- w = XtCreateManagedWidget("QUIT", xmPushButtonWidgetClass, buttonrc, al, ac);
- XtAddCallback(w, XmNactivateCallback, quit, NULL);
- w = XtCreateManagedWidget("VIEW", xmPushButtonWidgetClass, buttonrc, al, ac);
- XtAddCallback(w, XmNactivateCallback, view, NULL);
- w = XtCreateManagedWidget("HEX-VIEW", xmPushButtonWidgetClass, buttonrc, al, ac);
- XtAddCallback(w, XmNactivateCallback, hex_view, NULL);
- w = XtCreateManagedWidget("RENAME", xmPushButtonWidgetClass, buttonrc, al, ac);
- XtAddCallback(w, XmNactivateCallback, ren, NULL);
-
- get_buttons(buttonrc);
-
- /** attach to button strip **/
- ac = 0;
- XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_WIDGET); ac++;
- XtSetArg(al[ac], XmNbottomWidget, buttonrcframe); ac++;
- XtSetValues(rightform, al, ac);
- XtSetValues(leftform, al, ac);
-
- ac = 0;
- XtSetArg(al[ac], XmNrightAttachment, XmATTACH_POSITION); ac++;
- XtSetArg(al[ac], XmNrightPosition, 50); ac++;
- XtSetValues(leftform, al, ac);
-
- ac = 0;
- XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
- XtSetArg(al[ac], XmNleftWidget, leftform); ac++;
- XtSetArg(al[ac], XmNleftOffset, 10); ac++;
- XtSetValues(rightform, al, ac);
-
- init();
-
- XtRealizeWidget(toplevel);
- XtAppMainLoop(app_con);
- }
-