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

📄 smalledit.c

📁 具有IDE功能的编辑器
💻 C
字号:
/* smalledit.c - stripped down cooledit.c and demo of the Coolwidget library   Copyright (C) 1996-2000 Paul Sheer   This program is free software; you can redistribute it and/or modify   it under the terms of the GNU General Public License as published by   the Free Software Foundation; either version 2 of the License, or   (at your option) any later version.   This program is distributed in the hope that it will be useful,   but WITHOUT ANY WARRANTY; without even the implied warranty of   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the   GNU General Public License for more details.   You should have received a copy of the GNU General Public License   along with this program; if not, write to the Free Software   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA   02111-1307, USA. *//* * Comments: *  * This program consists of 5 sections: *  * - {{{ command-line options *     Processing of command-line using Coolwidget's command-line utility, *     well as declaration of some global variables. * - {{{ utilities *     Any string mamipulation functions needed. * - {{{ menu callbacks *     Actions taken by menu clicks. * - {{{ main *     Initialisation and main loop. *  */#include <config.h>#include <stdio.h>#include <stdlib.h>#include <signal.h>#include <sys/types.h>#if HAVE_SYS_WAIT_H# include <sys/wait.h>#endif#include <X11/Intrinsic.h>#include <X11/keysym.h>#include <X11/Xatom.h>#include "stringtools.h"#include "app_glob.c"#include "coolwidget.h"#include "edit.h"#include "editcmddef.h"#include "loadfile.h"#include "editoptions.h"#include "cmdlineopt.h"#include "shell.h"#include "pool.h"#include "copyright.h"#include "mad.h"/* default window sizes */#define START_WIDTH	80#define START_HEIGHT	25#undef gettext_noop#define gettext_noop(x) x/* {{{ command-line options */#ifdef HAVE_DNDextern int option_dnd_version;#endif/* editor widget: */CWidget *edit = 0;/* main and first window */Window main_window = 0;/* argv[0] */char *argv_nought = 0;/* font from the library */extern char *init_font;/* server from command line */char *option_display = 0;/* font from the command line */char *option_font = 0;static int get_help = 0;static int get_version = 0;extern int option_auto_spellcheck;/* other things on the command line */static char *command_line_args[] ={0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};void usage (void){    printf ( \	_("Smalledit version %s\nUsage:\n" \	"A stripped down version of cooledit.\n" \	"smalledit [options] [[+<line>] <file>]\n" \	"-d, -display <display>                   the X server to display on\n" \	"-f, -fn, -font <font-name>               default: 8x13bold\n" \	"-wordwrap, --word-wrap <length>          default: 72\n" \	"-typew, --type-writer                    type-writer word wrap\n" \	"-spell, --spell-checking                 spell-checking enabled\n" \	"-autop, --auto-paragraph                 word processor paragraphing\n" \	"-i, --international-characters           display international characters\n" \	"-dnd-old                                 use dnd version 0 instead of version 1\n" \	"-t, -tab, --tab-spacing <spacing>        set tab spacing\n" \	"-h, -H, -?, --help                       print this message to stdout\n" \	"-V, -v, --version                        print versiom info\n" \	"\n"), \	VERSION);}void version (void){    printf (_("Smalledit version %s\n"), VERSION);}struct prog_options cooledit_options[] ={    {' ', "", "", ARG_STRINGS, 0, command_line_args, 0},#ifdef HAVE_DND    {0, "-dnd-old", "--dnd-old", ARG_CLEAR, 0, 0, &option_dnd_version},#endif    {'f', "-fn", "-font", ARG_STRING, &option_font, 0, 0},    {'i', "", "--international-characters", ARG_SET, 0, 0, &option_international_characters},    {0, "-wordwrap", "--word-wrap", ARG_INT, 0, 0, &option_word_wrap_line_length},    {0, "-typew", "--type-writer", ARG_SET, 0, 0, &option_typewriter_wrap},    {0, "-autop", "--auto-paragraph", ARG_SET, 0, 0, &option_auto_para_formatting},    {0, "-spell", "--spell-checking", ARG_SET, 0, 0, &option_auto_spellcheck},    {'t', "-tab", "--tab-spacing", ARG_INT, 0, 0, &option_tab_spacing},    {'h', "-?", "--help", ARG_SET, 0, 0, &get_help},    {'H', "-help", "--help", ARG_SET, 0, 0, &get_help},    {'V', "-v", "--version", ARG_SET, 0, 0, &get_version},    {'d', "", "-display", ARG_STRING, &option_display, 0, 0},    {0, 0, 0, 0, 0, 0, 0}};/* here we use our own function (which is better than get_opt() or get_opt_long()) */static void process_command_line (int argc, char **argv){    int error;    option_auto_spellcheck = 0;    error = get_cmdline_options (argc, argv, cooledit_options);    if (error) {	fprintf (stderr, _("%s: error processing commandline argument %d\n"), argv[0], error);	usage ();	exit (1);    }    if (get_help)	usage ();    if (get_version)	version ();    if (get_help || get_version)	exit (0);}/* }}} command-line options *//* {{{ utilities */static char *get_full_filename (const char *f){    char *s, *p;    if (*f == '/')	return (char *) f;    s = malloc (2048);    if (getcwd (s, 2000)) {	p = (char *) strdup (catstrs (s, "/", f, 0));	free (s);	return p;    }    free (s);    return 0;}/* }}} utilities *//* {{{ menu callbacks */void run_main_callback (unsigned long ignore){    switch (fork ()) {    case 0:	CDisableAlarm ();	execlp (argv_nought, argv_nought, "-f", init_font, 0);	exit (1);    case -1:	CErrorDialog (0, 0, 0, _(" Run 'smalledit' "), get_sys_error (_(" Error trying to fork process ")));	return;    default:	return;    }}void edit_gnu_license (unsigned long line){    POOL *p;    int i;    p = pool_init ();    for (i = 0; copyright[i]; i++)	pool_printf (p, "%s\n", copyright[i]);    pool_null (p);    CTextboxMessageDialog (main_window, 20, 20, 77, 23, _ (" Copying "), (char *) pool_start (p), (int) line);    pool_free (p);}void menu_exit (unsigned long ignore){    CEditMenuCommand (CK_Exit);}void save_and_exit_callback (unsigned long ignore){    CEditMenuCommand (CK_Save);    menu_exit (0);}int about_callback (CWidget *w, XEvent *xe, CEvent *ce){    CMessageDialog (main_window, 20, 20, TEXT_CENTRED, _(" About "),      _("\n" \      "Smalledit  version  %s\n" \      "\n" \      "A cut down version of Cooledit -\n" \      "a text editor written for The X Window System.\n" \      "\n" \      "Copyright (C) 1996-2000 Paul Sheer\n" \      "\n" \      " Smalledit comes with ABSOLUTELY NO WARRANTY; for details \n" \      " click on 'no Warranty' in the File menu. \n" \      " This is free software, and you are welcome to redistribute it under \n" \      " certain conditions; click on 'Copying' for details. \n" \      " Smalledit is meant to demonstrate the Coolwidget X Window Library. \n" \      " Coolwidget is a high level API that contains all basic \n" \      " widgets and dialogs needed for writing X applications. \n" \      " This editor was written in only 400 lines. \n") , VERSION);    CFocus (edit);    return 1;}/* }}} menu callbacks */void load_trivial_options (void);extern Atom ATOM_WM_NAME;/* {{{ change my name by sasha*/void set_main_window_name( char* filename ){  char* full_title ;  CWidget *wdt = CWidgetOfWindow( main_window );        full_title = malloc( 8+ strlen(filename)+1);    sprintf( full_title, "edit: %s", filename );    if( wdt->label ) free( wdt->label );    wdt->label = full_title ;    XSetIconName (CDisplay, main_window, wdt->label);    XStoreName (CDisplay, main_window, wdt->label);    XChangeProperty (CDisplay, main_window, ATOM_WM_NAME, XA_STRING, 8,		     PropModeReplace, (unsigned char *) full_title, strlen (full_title));}/* }}} change my name by sasha *//* {{{ main */int main (int argc, char **argv){    CInitData cooledit_startup;    CEvent cwevent;    XEvent xevent;    char *window_title;    int columns, lines, x, x2, y, l = 0;    window_title = (char *) strdup ("");    columns = START_WIDTH;    lines = START_HEIGHT;/* needed for execlp */    argv_nought = (char *) strdup (argv[0]);/* locale settings */    if (!setlocale (LC_CTYPE, ""))	fprintf (stderr, _ ("%s: cannot set locale, see setlocale(3), current locale is %s\n"), argv_nought, setlocale (LC_MESSAGES, 0));    setlocale (LC_TIME, "");    setlocale (LC_MESSAGES, "");    bindtextdomain (PACKAGE, LOCALEDIR);    textdomain (PACKAGE);/* load some options from /.cedit/.cooledit.ini */    load_trivial_options ();/* use our special utility */    process_command_line (argc, argv);    get_home_dir ();/* intialise the library */    memset (&cooledit_startup, 0, sizeof (cooledit_startup));    cooledit_startup.name = argv_nought;    cooledit_startup.display = option_display;    cooledit_startup.font = option_font;    CInitialise (&cooledit_startup);/* create main window */    main_window = CDrawMainWindow ("smalledit", "Smalledit");/* draw the predefined edit menu buttons */    CGetHintPos (&x, &y);    CDrawEditMenuButtons ("smalledit", main_window, main_window, x, y);/* add some buttons of our own */    CAddMenuItem ("smalledit.filemenu", "", ' ', 0, 0);    CAddMenuItem ("smalledit.filemenu",		  _ ("No warranty..."), 'w', edit_gnu_license, 257UL);    CAddMenuItem ("smalledit.filemenu", "", ' ', 0, 0);    CAddMenuItem ("smalledit.filemenu",		  _ ("New main window\tS-F3"), 'm', run_main_callback, 0);    CAddMenuItem ("smalledit.filemenu",		  _ ("Exit\tF10"), 'E', menu_exit, 0);    CAddMenuItem ("smalledit.filemenu",	       _ ("Save and exit\tM-x"), 'x', save_and_exit_callback, 0);    CGetHintPos (&x2, 0);    CDrawButton ("about", main_window, x2, y, AUTO_SIZE, _ (" About "));    CAddCallback ("about", about_callback);    CGetHintPos (0, &y);/* draw the editor widget */    CPushFont ("editor", 0);    if (command_line_args[0]) {	char *q;	int i = 0;	if (command_line_args[0][0] == '+') {	    l = atoi (command_line_args[0] + 1) - 1;	    if (l < 0)		l = 0;	    i = 1;	}	q = get_full_filename (command_line_args[i]);        set_main_window_name( q );	edit = CDrawEditor ("editor", main_window, x, y, columns * FONT_MEAN_WIDTH,			    lines * FONT_PIX_PER_LINE, 0, q, 0, 0, 0);    }    if (!edit)	edit = CDrawEditor ("editor", main_window, x, y, columns * FONT_MEAN_WIDTH,	 lines * FONT_PIX_PER_LINE, "", 0, get_full_filename (""), 0, 0);    CPopFont ();/* move to line */    if (edit && l) {	edit_move_display (edit->editor, l);	edit_move_to_line (edit->editor, l);    }/* the edit menu refers to this editor */    CSetEditMenu (edit->ident);/* first menu to pull up */    CSetLastMenu (CIdent ("smalledit.filemenu"));/* set widget behaviour on resizing of main window */    edit->position |= (POSITION_WIDTH | POSITION_HEIGHT);    (CIdent ("editor.text"))->position |= (POSITION_BOTTOM | POSITION_WIDTH);    (CIdent ("editor.vsc"))->position |= (POSITION_RIGHT | POSITION_HEIGHT);/* resize main window to hold all widgets */    CSetSizeHintPos ("smalledit");/* set min and max window sizes */    CSetWindowResizable ("smalledit", 200, 200, 3200, 2400);/* show the window */    CMapDialog ("smalledit");/* now run */    for (;;) {	CNextEvent (&xevent, &cwevent);	if (edit) {	    if (edit->editor->stopped)		break;	} else	    break;/* skip these events */	if (xevent.type == Expose || !xevent.type || xevent.type == AlarmEvent	    || xevent.type == InternalExpose || xevent.type == TickEvent)	    continue;	if (edit)	    if (edit->editor->filename)		if (strcmp (window_title, edit->editor->filename)) {		    free (window_title);		    window_title = (char *) strdup (edit->editor->filename);		    set_main_window_name( window_title );		}	switch (xevent.type) {	case FocusIn:	    if (xevent.xany.window == main_window) {		CFocus (edit);		continue;	    }	case KeyPress:	    if (cwevent.kind == C_EDITOR_WIDGET || cwevent.kind == C_MENU_BUTTON_WIDGET) {		if (cwevent.kind != C_MENU_BUTTON_WIDGET) {		    switch ((int) cwevent.command) {		    case CK_Menu:	/* pull down the menu */			CMenuSelectionDialog (CGetLastMenu ());			break;		    case CK_Run_Another:	/* new editor window */			run_main_callback (0);			break;		    case CK_Check_Save_And_Quit:			menu_exit (0);			break;		    case CK_Save_And_Quit:			save_and_exit_callback (0);		    }		    break;		}	    }	    break;	}	if (xevent.type == QuitApplication) {	/* recieved because the user did a close with the WM. */	    int i;	    if (!edit->editor->modified) {		menu_exit (0);	    } else {		i = CQueryDialog (0, 0, 0,				  _ (" Quit "), _ (" Quit Smalledit ? "), _ (" Cancel quit "), _ (" Quit and save all "),				  _ (" Quit, do not save "), 0);		switch (i) {		case 0:		    break;		case 1:		    save_and_exit_callback (0);		    break;		case 2:		    CDestroyWidget (edit->ident);		    edit = 0;		    break;		}		continue;	    }	}    }/* close connection to the X display */    CShutdown ();    return 0;}/* }}} main */

⌨️ 快捷键说明

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