⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 fv.cmd.c

📁 操作系统SunOS 4.1.3版本的源码
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef lintstatic  char sccsid[] = "@(#)fv.cmd.c 1.1 92/07/30 Copyr 1988 Sun Micro";#endif/*	Copyright (c) 1987, 1988, Sun Microsystems, Inc.  All Rights Reserved.	Sun considers its source code as an unpublished, proprietary	trade secret, and it is available only under strict license	provisions.  This copyright notice is placed here only to protect	Sun in the event the source is deemed a published work.  Dissassembly,	decompilation, or other means of reducing the object code to human	readable form is prohibited by the license agreement under which	this code is provided to the user or company in possession of this	copy.	RESTRICTED RIGHTS LEGEND: Use, duplication, or disclosure by the 	Government is subject to restrictions as set forth in subparagraph 	(c)(1)(ii) of the Rights in Technical Data and Computer Software 	clause at DFARS 52.227-7013 and in similar clauses in the FAR and 	NASA FAR Supplement. */#include <stdio.h>#include <errno.h>#include <sys/types.h>#include <sys/stat.h>#include <sys/file.h>#ifdef SV1# include <suntool/scrollbar.h># include <suntool/sunview.h># include <suntool/panel.h># include <suntool/canvas.h>#else# include <view2/scrollbar.h># include <view2/view2.h># include <view2/panel.h># include <view2/canvas.h>#endif#include "fv.port.h"#include "fv.h"#include "fv.extern.h"/* Control panel items */static Panel_item File_button;static Panel_item View_button;static Panel_item Edit_button;static Panel_item Find_button;static Panel_item Home_button;static Panel_item Load_button;		/* Load into application; global */static Panel_item Path_item;static Menu Home_menu;static Menu Cmd_menu;static int Ncmds;			/* Number of your commands */static Menu Filemenu;			/* Access the file system menu */#define M_OPEN		1#define M_PRINT		2#define M_CREATE_FOLDER	3#define M_CREATE_FILE	4#define M_YOUR_COMMAND	5#define OPEN		1		/* Open's pull right menu */#define RUN_WITH_ARGS	2#define EDIT		3#define SHELL		4static Menu Viewmenu;			/* Change the visual state menu */#define M_TREE		1#define M_EXPAND	2#define M_EXPAND_ALL	3#define M_BEGINTREE	4#define M_ADDPARENT	5static Menu Editmenu;			/* Modify object menu */#define M_UNDELETE	1#define M_COPY		3#define M_PASTE		4#define M_CUT		5#define M_DELETE	6#define M_PROPS		7#ifdef SV1				/* Space between EDIT and HOME */# ifdef PROTO#  define HOME_COL	19# else#  define HOME_COL	21# endif#else# define HOME_COL	15#endifstatic Menu Gotomenu;static char Goto_field[80];/* Prototype has Shine Mark and menu title counts as one */#ifdef PROTO#define OPEN_EDIT_FLOATER	1#define OPEN_VIEW_FLOATER	1#define PROPS_VIEW_FLOATER	7#define REMOTE_COPY	"Remote Transfer \002"#define BIND_ACTION	"Bind Action to Object \002"#define FILE_PROPS	"File Properties \002"#else#define OPEN_EDIT_FLOATER	2#define OPEN_VIEW_FLOATER	2#define PROPS_VIEW_FLOATER	8#define REMOTE_COPY	"Remote Transfer..."#define BIND_ACTION	"Bind Action to Object..."#define FILE_PROPS	"File Properties..."#endifstatic Menu Tree_floater;	/* Path pane floating menu */static Menu Folder_floater;	/* Folder pane floating menu *//* IF YOU CHANGE THE WORDS, YOU MUST CHANGE THE ARRAY SIZES! */static char *Path_s[2] = {"Path", "Tree"};static char Path_p[5];static char *Hide_s[2] = {"Hide Subfolders", "Show Subfolders"};static char Hide_p[16];static voidfile_button(item, event)		/* Process File button, display menu */	Panel_item item;	Event *event;{	Menu_item mi;			/* Grab menu item for manipulation */	int seln;			/* Selected object in folder pane */	BOOLEAN no_print;		/* No printing? */	BOOLEAN no_seln;		/* No selection in tree or folder pane? */#ifdef PROTO	/* XXX BUG IN LEIF LOOK */	if (event_id(event) == MS_LEFT)		return;#endif		/* The philosophy behind menus is that nothing can be selected	 * unless it can genuinely apply.	 */	seln = fv_getselectedfile();	no_seln = seln == EMPTY && !Fv_tselected;	/* XXX What about shell scripts? */	no_print = seln == EMPTY || Fv_file[seln]->type != FV_IDOCUMENT;	if (event_id(event) == MS_RIGHT && event_is_down(event))	{		mi = menu_get(Filemenu, MENU_NTH_ITEM, M_OPEN);		menu_set(mi, MENU_INACTIVE, no_seln, 0);		mi = menu_get(Filemenu, MENU_NTH_ITEM, M_PRINT);		menu_set(mi, MENU_INACTIVE, no_print, 0);		mi = menu_get(Filemenu, MENU_NTH_ITEM, M_CREATE_FOLDER);		menu_set(mi, MENU_INACTIVE, !Fv_write_access, 0);		mi = menu_get(Filemenu, MENU_NTH_ITEM, M_CREATE_FILE);		menu_set(mi, MENU_INACTIVE, !Fv_write_access, 0);		mi = menu_get(Filemenu, MENU_NTH_ITEM, M_YOUR_COMMAND);		menu_set(mi, MENU_INACTIVE, Ncmds==0, 0);#ifdef SV1# ifdef PROTO	}# else		menu_show(Filemenu, Fv_panel, event, 0);		return;	}	else if (event_id(event) == MS_LEFT && event_is_up(event))		open_object();# endif#else	}#endif	panel_default_handle_event(item, event);}staticopen_object()			/* Open selected object in path/folder pane */{	if (Fv_tselected)		fv_open_folder();	else	{		fv_busy_cursor(TRUE);		fv_file_open(fv_getselectedfile(), FALSE, NULL, FALSE);		fv_busy_cursor(FALSE);	}}staticrun_object(m, mi)		/* Process Open pull right */	Menu m;	Menu_item mi;{	int i = (int)menu_get(mi, MENU_CLIENT_DATA);	register FV_FILE **f_p, **l_p;	/* Files array pointers */	int j;	fv_busy_cursor(TRUE);	for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles, j=0; f_p != l_p; f_p++, j++)		if ((*f_p)->selected)			fv_file_open(j, i == EDIT, 				i == RUN_WITH_ARGS ? panel_get_value(Path_item) : NULL,				i == SHELL);	fv_busy_cursor(FALSE);}staticprint_object()			/* Print selected objects in folder pane */{	char buf[MAXPATH-80];		/* File buffer */	char print[MAXPATH];		/* Print script */	fv_busy_cursor(TRUE);	fv_collect_selected(buf, TRUE);	/* ...and send them to the printer */	(void)sprintf(print, Fv_print_script, buf);	if (system(print))		fv_showerr();	else	{		buf[60] = NULL;		fv_putmsg(FALSE, Fv_message[MPRINT], (int)buf, 0);	}	fv_busy_cursor(FALSE);}fv_collect_selected(buf, docs_only)	char *buf;	BOOLEAN docs_only;{	register int i = 0;		/* Index */	register FV_FILE **f_p, **l_p;	/* Files array pointers */	/* Collect all the selected files... */	for (f_p=Fv_file, l_p=Fv_file+Fv_nfiles; f_p != l_p; f_p++)		if ((*f_p)->selected)		{			if (docs_only && (*f_p)->type != FV_IDOCUMENT)				continue;			if (i)				(void)strcat(buf, (*f_p)->name);			else				(void)strcpy(buf, (*f_p)->name);			(void)strcat(buf, " ");			i++;		}}staticcreate_folder(){	static char name[12] = "NewFolder";	/* Generic name */	new_file(TRUE, name, 9);}staticcreate_file(){	static char name[12] = "NewFile";	/* Generic name */	new_file(FALSE, name, 7);}staticnew_file(folder, name, pos)			/* Create an empty file */	BOOLEAN folder;	char *name;	register int pos;{	register FV_TNODE *f_p, *nf_p, *of_p;	/* Tree pointers */	register int i;				/* Index */	FV_TNODE *tree_p;			/* Who owns it? */	int fd;	/* Ensure we're back in current directory */	if (Fv_tselected && (chdir(Fv_openfolder_path) == -1))		fv_putmsg(TRUE, Fv_message[MECHDIR], (int)Fv_openfolder_path, 			(int)sys_errlist[errno]);	/* Make 10 attempts to make a unique file name */	name[pos] = NULL;	errno = EEXIST;	for (i = 1; i <= 10 && errno == EEXIST; i++)	{		if (folder)		{			if (mkdir(name, 0777) == 0)				break;		}		else			if ((access(name, F_OK) == -1) &&			    ((fd = open(name, O_WRONLY|O_CREAT, 00666)) != -1))			{				(void)close(fd);				break;			}		name[pos] = i+'0';		name[pos+1] = NULL;	}	if (i > 10)	{		/* No luck, bitch and return */		fv_putmsg(TRUE, Fv_message[MECREAT],			(int)name, (int)sys_errlist[errno]);		return;	}	if (folder)	{	/* Build structure and insert it into tree, placing it in correct 	 * alphabetic order..	 */	if ( ((f_p=(FV_TNODE *)fv_malloc(sizeof(FV_TNODE))) == NULL) ||	     ((f_p->name = fv_malloc((unsigned)strlen(name)+1)) == NULL))		return;	f_p->child = NULL;	f_p->parent = Fv_current;	f_p->mtime = time((time_t)0);	f_p->status = 0;	(void)strcpy(f_p->name, name);	for (of_p = NULL, nf_p = Fv_current->child; nf_p; 		of_p = nf_p, nf_p = nf_p->sibling)		if (strcmp(f_p->name, nf_p->name) < 0)		{			if (of_p)				of_p->sibling = f_p;			else				Fv_current->child = f_p;			f_p->sibling = nf_p;			break;		}	/* Deselect folder in tree, select folder in folder pane, redraw... */	if (Fv_tselected)		fv_treedeselect();	fv_drawtree(TRUE);	}	fv_display_folder(FV_BUILD_FOLDER);	fv_match_files(name);}static voidview_button(item, event)		/* Process View button */	Panel_item item;	Event *event;{	if (event_id(event) == MS_RIGHT && event_is_down(event))	{		fv_viewmenu(Fv_panel, event, FALSE);		return;	}#ifdef SV1# ifndef PROTO	else if (event_id(event) == MS_LEFT && event_is_up(event))	{		/* Toggle between tree and path */		path_or_tree();	}# endif#endif	panel_default_handle_event(item, event);}fv_viewmenu(win, event, floater)		/* Display View menu */	Window win;	Event *event;	BOOLEAN floater;{	Menu_item mi;	Menu m = floater ? Tree_floater : Viewmenu;	/* Again the same philosophy prevails; don't allow	 * user to choose unavailable function.	 */	if (floater)	{#ifdef PROTO		menu_set(m, MENU_FONT, window_get(Fv_frame, WIN_FONT), 0);#endif		mi = menu_get(m, MENU_NTH_ITEM, OPEN_VIEW_FLOATER);		menu_set(mi, MENU_INACTIVE, !Fv_tselected, 0);		mi = menu_get(m, MENU_NTH_ITEM, PROPS_VIEW_FLOATER);		menu_set(mi, MENU_INACTIVE, !Fv_tselected, 0);#ifndef SV1		floater = 2;			/* View2 popup menus have title */#endif	}	/* Expand/contract folder is context sensitive */	if (Fv_tselected)		(void)strcpy(Hide_p, Hide_s[Fv_tselected->mtime==0 ||			Fv_tselected->status&PRUNE]);	mi = menu_get(m, MENU_NTH_ITEM, M_EXPAND+floater);	menu_set(mi, MENU_INACTIVE, 		!Fv_tselected || !Fv_treeview ||		(!Fv_tselected->child && Fv_tselected->mtime),		0);	mi = menu_get(m, MENU_NTH_ITEM, M_EXPAND_ALL+floater);	menu_set(mi, MENU_INACTIVE, !Fv_tselected || !Fv_treeview, 0);	mi = menu_get(m, MENU_NTH_ITEM, M_BEGINTREE+floater);	menu_set(mi, MENU_INACTIVE, !Fv_tselected || !Fv_treeview, 0);	mi = menu_get(m, MENU_NTH_ITEM, M_ADDPARENT+floater);	menu_set(mi, MENU_INACTIVE, Fv_troot == Fv_thead, 0);	/* The prototype and View2 have default actions on menus */#ifdef SV1# ifdef PROTO	if (floater)		menu_show(m, win, event, 0);	else		panel_default_handle_event(View_button, event);# else	menu_show(m, win, event, 0);# endif#else	if (floater)		menu_show(m, win, event, 0);	else		panel_default_handle_event(View_button, event);#endif}staticpath_or_tree()				/* Toggle between path and tree */{	/* Flip toggle every time we enter this function */	(void)strcpy(Path_p, Path_s[Fv_treeview]);	Fv_treeview = !Fv_treeview;	Fv_dont_paint = TRUE;		/* Avoid repaint */	if (!Fv_treeview)	{		fv_treedeselect();		if (Fv_thead && Fv_thead != Fv_troot)		{			Fv_thead->sibling = Fv_sibling;			Fv_thead = Fv_troot;		}	}	if (Fv_treeview && Fv_tree.hsbar == 0) {	       Fv_tree.hsbar = scrollbar_create(#ifdef SV1			SCROLL_PLACEMENT, SCROLL_SOUTH,#endif			SCROLL_LINE_HEIGHT, 10, 0);		Fv_tree.vsbar = scrollbar_create(#ifdef SV1			SCROLL_PLACEMENT, SCROLL_EAST,#endif			SCROLL_LINE_HEIGHT, 10, 0);	}	/* Create or destroy scrollbars according to path or tree mode */	window_set(Fv_tree.canvas,		WIN_VERTICAL_SCROLLBAR, Fv_treeview ? Fv_tree.vsbar : NULL,		WIN_HORIZONTAL_SCROLLBAR, Fv_treeview ? Fv_tree.hsbar : NULL,		0);	Fv_dont_paint = FALSE;	/* Resize windows; this will redisplay entire tool */	fv_resize(TRUE);	fv_namestripe();}static voidedit_button(item, event)		/* Process edit button */	Panel_item item;	Event *event;{	if (event_id(event) == MS_RIGHT && event_is_down(event))		fv_editmenu(Fv_panel, event, FALSE);	else		panel_default_handle_event(item, event);}fv_editmenu(window, event, floater)	/* Bring up edit menu */	Window window;	Event *event;	BOOLEAN floater;{	Menu_item mi;	Menu m = floater ? Folder_floater : Editmenu;	BOOLEAN no_seln = fv_getselectedfile() == EMPTY;	if (floater)	{#ifdef PROTO		menu_set(m, MENU_FONT, window_get(Fv_frame, WIN_FONT), 0);#endif		mi = menu_get(m, MENU_NTH_ITEM,	OPEN_EDIT_FLOATER);		menu_set(mi, MENU_INACTIVE, no_seln, 0);#ifndef SV1		floater = 2;			/* View2 popup menus have title */#endif	}	else		if (Fv_tselected)		/* Check trees */			no_seln = FALSE;	mi = menu_get(m, MENU_NTH_ITEM, M_UNDELETE+floater);	menu_set(mi, MENU_INACTIVE, !Fv_undelete, 0);	mi = menu_get(m, MENU_NTH_ITEM, M_CUT+floater);	menu_set(mi, MENU_INACTIVE, no_seln, 0);	mi = menu_get(m, MENU_NTH_ITEM, M_COPY+floater);	menu_set(mi, MENU_INACTIVE, no_seln, 0);	mi = menu_get(m, MENU_NTH_ITEM, M_PASTE+floater);	menu_set(mi, MENU_INACTIVE, !Fv_write_access, 0);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -