diff options
author | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
---|---|---|
committer | Eduardo Chappa <echappa@gmx.com> | 2013-02-03 00:59:38 -0700 |
commit | 094ca96844842928810f14844413109fc6cdd890 (patch) | |
tree | e60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /pico/pico.h | |
download | alpine-094ca96844842928810f14844413109fc6cdd890.tar.xz |
Initial Alpine Version
Diffstat (limited to 'pico/pico.h')
-rw-r--r-- | pico/pico.h | 452 |
1 files changed, 452 insertions, 0 deletions
diff --git a/pico/pico.h b/pico/pico.h new file mode 100644 index 00000000..cf25abea --- /dev/null +++ b/pico/pico.h @@ -0,0 +1,452 @@ +/* + * $Id: pico.h 1204 2009-02-02 19:54:23Z hubert@u.washington.edu $ + * + * ======================================================================== + * Copyright 2006-2009 University of Washington + * Copyright 2013 Eduardo Chappa + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * ======================================================================== + * + * Program: pico.h - definitions for Pine's composer library + */ + +#ifndef PICO_H +#define PICO_H + +#include "mode.h" + +#include "../pith/osdep/color.h" +#include "../pith/osdep/err_desc.h" +#include "../pith/charconv/utf8.h" + +#define errstr(n) error_description(n) + +/* + * Defined for attachment support + */ +#define ATTACHMENTS 1 + + +/* + * defs of return codes from pine mailer composer. + */ +#define BUF_CHANGED 0x01 +#define COMP_CANCEL 0x02 +#define COMP_EXIT 0x04 +#define COMP_FAILED 0x08 +#define COMP_SUSPEND 0x10 +#define COMP_GOTHUP 0x20 + + +/* + * top line from the top of the screen for the editor to do + * its stuff + */ +#define COMPOSER_TOP_LINE 2 +#define COMPOSER_TITLE_LINE 0 + + + +#define HLSZ NLINE + +/* + * definitions of Mail header structures + */ +struct hdr_line { + UCS text[HLSZ]; + struct hdr_line *next; + struct hdr_line *prev; +}; + + +/* must be the same as HelpType in pith/helptext.h */ +#define HELP_T char ** + + +/* + * This structure controls the header line items on the screen. An + * instance of this should be created and passed in as an argument when + * pico is called. The list is terminated by an entry with the name + * element NULL. + */ + +struct headerentry { + char *prompt; + char *name; + HELP_T help; + int prwid; /* prompt width on screen */ + int maxlen; + char **realaddr; + int (*builder)(); /* Function to verify/canonicalize val */ + struct headerentry *affected_entry, *next_affected; + /* entry builder's 4th arg affects */ + char *(*selector)(); /* Browser for possible values */ + char *key_label; /* Key label for key to call browser */ + char *(*fileedit)(); /* Editor for file named in header */ + int (*nickcmpl)(); /* routine that helps with nickname completion */ + unsigned display_it:1; /* field is to be displayed by default */ + unsigned break_on_comma:1; /* Field breaks on commas */ + unsigned is_attach:1; /* Special case field for attachments */ + unsigned rich_header:1; /* Field is part of rich header */ + unsigned only_file_chars:1; /* Field is a file name */ + unsigned single_space:1; /* Crush multiple spaces into one */ + unsigned sticky:1; /* Can't change this via affected_entry*/ + unsigned dirty:1; /* We've changed this entry */ + unsigned start_here:1; /* begin composer on first on lit */ + unsigned blank:1; /* blank line separator */ + unsigned sticky_special:1; /* special treatment */ +#ifdef KS_OSDATAVAR + KS_OSDATAVAR /* Port-Specific keymenu data */ +#endif + void *bldr_private; /* Data managed by builders */ + struct hdr_line *hd_text; +}; + + +/* + * Structure to pass as arg to builders. + * + * me -- A pointer to the bldr_private data for the entry currently + * being edited. + * tptr -- A malloc'd copy of the displayed text for the affected_entry + * pointed to by the aff argument. + * aff -- A pointer to the bldr_private data for the affected_entry (the + * entry that this entry affects). + * next -- The next affected_entry in the list. For example, the Lcc entry + * affects the To entry which affects the Fcc entry. + */ +typedef struct bld_arg { + void **me; + char *tptr; + void **aff; + struct bld_arg *next; +} BUILDER_ARG; + + +/* + * structure to keep track of header display + */ +struct on_display { + int p_ind; /* index into line */ + int p_len; /* length of line */ + int p_line; /* physical line on screen */ + int top_e; /* topline's header entry */ + struct hdr_line *top_l; /* top line on display */ + int cur_e; /* current header entry */ + struct hdr_line *cur_l; /* current hd_line */ +}; /* global on_display struct */ + + +/* + * Structure to handle attachments + */ +typedef struct pico_atmt { + char *description; /* attachment description */ + char *filename; /* file/pseudonym for attachment */ + char *size; /* size of attachment */ + char *id; /* attachment id */ + unsigned short flags; + struct pico_atmt *next; +} PATMT; + +/* + * Structure to contain color options + */ +typedef struct pico_colors { + COLOR_PAIR *tbcp; /* title bar color pair */ + COLOR_PAIR *klcp; /* key label color pair */ + COLOR_PAIR *kncp; /* key name color pair */ + COLOR_PAIR *stcp; /* status color pair */ + COLOR_PAIR *prcp; /* prompt color pair */ +} PCOLORS; + +/* + * Flags for attachment handling + */ +#define A_FLIT 0x0001 /* Accept literal file and size */ +#define A_ERR 0x0002 /* Problem with specified attachment */ +#define A_TMP 0x0004 /* filename is temporary, delete it */ + + +/* + * Master pine composer structure. Right now there's not much checking + * that any of these are pointing to something, so pine must have them pointing + * somewhere. + */ +typedef struct pico_struct { + void *msgtext; /* ptrs to malloc'd arrays of char */ + char *pine_anchor; /* ptr to pine anchor line */ + char *pine_version; /* string containing Pine's version */ + char *oper_dir; /* Operating dir (confine to tree) */ + char *home_dir; /* Home directory that should be used (WINDOWS) */ + char *quote_str; /* prepended to lines of quoted text */ + char *exit_label; /* Label for ^X in keymenu */ + char *ctrlr_label; /* Label for ^R in keymenu */ + char *alt_spell; /* Checker to use other than "spell" */ + char **alt_ed; /* name of alternate editor or NULL */ + UCS *wordseps; /* word separator characters other than space */ + int fillcolumn; /* where to wrap */ + int menu_rows; /* number of rows in menu (0 or 2) */ + int space_stuffed; /* space-stuffed for flowed, in case needs undoing */ + long edit_offset; /* offset into hdr line or body */ + PATMT *attachments; /* linked list of attachments */ + PCOLORS *colors; /* colors for titlebar and keymenu */ + void *input_cs; /* passed to mbtow() via kbseq() */ + long pine_flags; /* entry mode flags */ + /* The next few bits are features that don't fit in pine_flags */ + /* If we had this to do over, it would probably be one giant bitmap */ + unsigned always_spell_check:1; /* always spell-checking upon quit */ + unsigned strip_ws_before_send:1; /* don't default strip bc of flowed */ + unsigned allow_flowed_text:1; /* clean text when done to keep flowed */ + int (*helper)(); /* Pine's help function */ + int (*showmsg)(); /* Pine's display_message */ + UCS (*suspend)(); /* Pine's suspend */ + void (*keybinput)(); /* Pine's keyboard input indicator */ + int (*tty_fix)(); /* Let Pine fix tty state */ + long (*newmail)(); /* Pine's report_new_mail */ + long (*msgntext)(); /* callback to get msg n's text */ + int (*upload)(); /* callback to rcv uplaoded text */ + char *(*ckptdir)(); /* callback for checkpoint file dir */ + int (*exittest)(); /* callback to verify exit request */ + char *(*canceltest)(); /* callback to verify cancel request */ + int (*mimetype)(); /* callback to display mime type */ + int (*expander)(); /* callback to expand address lists */ + int (*user_says_noflow)(); /* callback to tell us we're not flowing */ + void (*resize)(); /* callback handling screen resize */ + void (*winch_cleanup)(); /* callback handling screen resize */ + void (*newthread)(); /* callback to create new thread */ + int arm_winch_cleanup; /* do the winch_cleanup if resized */ + HELP_T search_help; + HELP_T ins_help; + HELP_T ins_m_help; + HELP_T composer_help; + HELP_T browse_help; + HELP_T attach_help; + struct headerentry *headents; +} PICO; + + +/* + * Used to save and restore global pico variables that are destroyed by + * calling pico a second time. This happens when pico calls a selector + * in the HeaderEditor and that selector calls pico again. + */ +typedef struct save_stuff { + int vtrow, + vtcol, + lbound; + VIDEO **vscreen, + **pscreen; /* save pointers */ + struct on_display ods; /* save whole struct */ + short delim_ps, + invert_ps; + int pico_all_done; + jmp_buf finstate; + UCS *pico_anchor; /* save pointer */ + PICO *Pmaster; /* save pointer */ + int fillcol; + UCS *pat; /* save array */ + int ComposerTopLine, + ComposerEditing; + long gmode; + char *alt_speller; /* save pointer */ + UCS *quote_str; /* save pointer */ + UCS *wordseps; /* save pointer */ + int currow, + curcol, + thisflag, + lastflag, + curgoal; + char *opertree; /* save array */ + WINDOW *curwp; /* save pointer */ + WINDOW *wheadp; /* save pointer */ + BUFFER *curbp; /* save pointer */ + BUFFER *bheadp; /* save pointer */ + int km_popped; + int mrow; +} VARS_TO_SAVE; + + +#ifdef MOUSE +/* + * Mouse buttons. + */ +#define M_BUTTON_LEFT 0 +#define M_BUTTON_MIDDLE 1 +#define M_BUTTON_RIGHT 2 + + +/* + * Flags. (modifier keys) + */ +#define M_KEY_CONTROL 0x01 /* Control key was down. */ +#define M_KEY_SHIFT 0x02 /* Shift key was down. */ + + +/* + * Mouse Events + */ +#define M_EVENT_DOWN 0x01 /* Mouse went down. */ +#define M_EVENT_UP 0x02 /* Mouse went up. */ +#define M_EVENT_TRACK 0x04 /* Mouse tracking */ + +/* + * Mouse event information. + */ +typedef struct mouse_struct { + unsigned long mevent; /* Indicates type of event: Down, Up or Track */ + char down; /* TRUE when mouse down event */ + char doubleclick; /* TRUE when double click. */ + int button; /* button pressed. */ + int flags; /* What other keys pressed. */ + int row; + int col; +} MOUSEPRESS; + + + +typedef unsigned long (*mousehandler_t)(unsigned long, int, int, int, int); + +typedef struct point { + unsigned r:8; /* row value */ + unsigned c:8; /* column value */ +} MPOINT; + + +typedef struct menuitem { + unsigned val; /* return value */ + mousehandler_t action; /* action to perform */ + MPOINT tl; /* top-left corner of active area */ + MPOINT br; /* bottom-right corner of active area */ + MPOINT lbl; /* where the label starts */ + char *label; + void (*label_hiliter)(); + COLOR_PAIR *kncp; /* key name color pair */ + COLOR_PAIR *klcp; /* key label color pair */ + struct menuitem *next; +} MENUITEM; +#endif + + +/* + * Structure used to manage keyboard input that comes as escape + * sequences (arrow keys, function keys, etc.) + */ +typedef struct KBSTREE { + char value; + int func; /* Routine to handle it */ + struct KBSTREE *down; + struct KBSTREE *left; +} KBESC_T; + + +/* + * various flags that they may passed to PICO + */ +#define P_HICTRL 0x80000000 /* overwrite mode */ +#define P_CHKPTNOW 0x40000000 /* do the checkpoint on entry */ +#define P_DELRUBS 0x20000000 /* map ^H to forwdel */ +#define P_LOCALLF 0x10000000 /* use local vs. NVT EOL */ +#define P_BODY 0x08000000 /* start composer in body */ +#define P_HEADEND 0x04000000 /* start composer at end of header */ +#define P_VIEW MDVIEW /* read-only */ +#define P_FKEYS MDFKEY /* run in function key mode */ +#define P_SECURE MDSCUR /* run in restricted (demo) mode */ +#define P_TREE MDTREE /* restrict to a subtree */ +#define P_SUSPEND MDSSPD /* allow ^Z suspension */ +#define P_ADVANCED MDADVN /* enable advanced features */ +#define P_CURDIR MDCURDIR /* use current dir for lookups */ +#define P_ALTNOW MDALTNOW /* enter alt ed sans hesitation */ +#define P_SUBSHELL MDSPWN /* spawn subshell for suspend */ +#define P_COMPLETE MDCMPLT /* enable file name completion */ +#define P_DOTKILL MDDTKILL /* kill from dot to eol */ +#define P_SHOCUR MDSHOCUR /* cursor follows hilite in browser*/ +#define P_HIBITIGN MDHBTIGN /* ignore chars with hi bit set */ +#define P_DOTFILES MDDOTSOK /* browser displays dot files */ +#define P_NOBODY MDHDRONLY /* Operate only on given headers */ +#define P_ALLOW_GOTO MDGOTO /* support "Goto" in file browser */ +#define P_REPLACE MDREPLACE /* allow "Replace" in "Where is" */ + + +/* + * Main defs + */ +#ifdef maindef +PICO *Pmaster = NULL; /* composer specific stuff */ +char *version = "5.05"; /* PICO version number */ + +#else +extern PICO *Pmaster; /* composer specific stuff */ +extern char *version; /* pico version! */ + +#endif /* maindef */ + + +/* + * Flags for FileBrowser call + */ +#define FB_READ 0x0001 /* Looking for a file to read. */ +#define FB_SAVE 0x0002 /* Looking for a file to save. */ +#define FB_ATTACH 0x0004 /* Looking for a file to attach */ +#define FB_LMODEPOS 0x0008 /* ListMode is a possibility */ +#define FB_LMODE 0x0010 /* Using ListMode now */ + + +/* + * Flags for pico_readc/pico_writec. + */ +#define PICOREADC_NONE 0x00 +#define PICOREADC_NOUCS 0x01 + + +/* + * number of keystrokes to delay removing an error message, or new mail + * notification, or checkpointing + */ +#define MESSDELAY 25 +#define NMMESSDELAY 60 +#ifndef CHKPTDELAY +#define CHKPTDELAY 100 +#endif + +#include "./keydefs.h" + + +/* + * useful function definitions + */ +int pico(PICO *pm); +int pico_file_browse(PICO *, char *, size_t, char *, size_t, char *, size_t, int); +void *pico_get(void); +void pico_give(void *w); +int pico_readc(void *w, unsigned char *c, int flags); +int pico_writec(void *w, int c, int flags); +int pico_puts(void *w, char *s, int flags); +int pico_seek(void *w, long offset, int orig); +int pico_replace(void *, char *); +int pico_fncomplete(char *, char *, size_t); +#if defined(DOS) || defined(OS2) +int pico_nfsetcolor(char *); +int pico_nbsetcolor(char *); +int pico_rfsetcolor(char *); +int pico_rbsetcolor(char *); +#endif +#ifdef MOUSE +int register_mfunc(mousehandler_t, int, int, int, int); +void clear_mfunc(mousehandler_t); +unsigned long mouse_in_content(unsigned long, int, int, int, int); +unsigned long mouse_in_pico(unsigned long, int, int, int, int); +void mouse_get_last(mousehandler_t *, MOUSEPRESS *); +void register_key(int, unsigned, char *, void (*)(), + int, int, int, COLOR_PAIR *, COLOR_PAIR *); +int mouse_on_key(int, int); +#endif /* MOUSE */ + + +#endif /* PICO_H */ |