source: owl.h @ 52891b5

barnowl_perlaimdebianrelease-1.10release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since 52891b5 was 8fa9562, checked in by Alejandro R. Sedeño <asedeno@mit.edu>, 17 years ago
Added background color support to owl. If we run out of color pairs during a painting of the screen, further background colors will be silently dropped. I'm hoping this doesn't happen often. The used pair list is reset with each draw, so only what's actually on screen matters.
  • Property mode set to 100644
File size: 17.3 KB
Line 
1/*  Copyright (c) 2004 James Kretchmar. All rights reserved.
2 *
3 *  Redistribution and use in source and binary forms, with or without
4 *  modification, are permitted provided that the following conditions are
5 *  met:
6 * 
7 *    * Redistributions of source code must retain the above copyright
8 *      notice, this list of conditions and the following disclaimer.
9 * 
10 *    * Redistributions in binary form must reproduce the above copyright
11 *      notice, this list of conditions and the following disclaimer in
12 *      the documentation and/or other materials provided with the
13 *      distribution.
14 * 
15 *    * Redistributions in any form must be accompanied by information on
16 *      how to obtain complete source code for the Owl software and any
17 *      accompanying software that uses the Owl software. The source code
18 *      must either be included in the distribution or be available for no
19 *      more than the cost of distribution plus a nominal fee, and must be
20 *      freely redistributable under reasonable conditions. For an
21 *      executable file, complete source code means the source code for
22 *      all modules it contains. It does not include source code for
23 *      modules or files that typically accompany the major components of
24 *      the operating system on which the executable file runs.
25 * 
26 *
27 *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
28 *  IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
29 *  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, OR
30 *  NON-INFRINGEMENT, ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
31 *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
32 *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
33 *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
34 *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
35 *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
36 *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
37 *  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
38 */
39
40#ifndef INC_OWL_H
41#define INC_OWL_H
42
43#include <sys/param.h>
44#include <EXTERN.h>
45#include <netdb.h>
46#include <regex.h>
47#include <time.h>
48#include <signal.h>
49#include <termios.h>
50#include <libfaim/aim.h>
51#include "config.h"
52#ifdef HAVE_LIBZEPHYR
53#include <zephyr/zephyr.h>
54#endif
55#ifdef HAVE_COM_ERR_H
56#include <com_err.h>
57#endif
58
59/* Perl and curses don't play nice. */
60#ifdef OWL_PERL
61typedef void WINDOW;
62#include <perl.h>
63#include "XSUB.h"
64#else
65#include <curses.h>
66typedef void SV;
67#endif
68
69static const char owl_h_fileIdent[] = "$Id$";
70
71#define OWL_VERSION         2.1.11
72#define OWL_VERSION_STRING "2.1.11-doh"
73
74/* Feature that is being tested to redirect stderr through a pipe.
75 * There may still be some portability problems with this. */
76#define OWL_STDERR_REDIR 1
77
78#define OWL_DEBUG 0
79#define OWL_DEBUG_FILE "/var/tmp/owldebug"
80
81#define OWL_CONFIG_DIR "/.owl"             /* this is relative to the user's home directory */
82#define OWL_STARTUP_FILE "/.owl/startup"   /* this is relative to the user's home directory */
83
84#define OWL_FMTEXT_ATTR_NONE      0
85#define OWL_FMTEXT_ATTR_BOLD      1
86#define OWL_FMTEXT_ATTR_REVERSE   2
87#define OWL_FMTEXT_ATTR_UNDERLINE 4
88
89#define OWL_COLOR_BLACK     0
90#define OWL_COLOR_RED       1
91#define OWL_COLOR_GREEN     2
92#define OWL_COLOR_YELLOW    3
93#define OWL_COLOR_BLUE      4
94#define OWL_COLOR_MAGENTA   5
95#define OWL_COLOR_CYAN      6
96#define OWL_COLOR_WHITE     7
97#define OWL_COLOR_DEFAULT   8
98
99#define OWL_EDITWIN_STYLE_MULTILINE 0
100#define OWL_EDITWIN_STYLE_ONELINE   1
101
102#define OWL_PROTOCOL_ZEPHYR         0
103#define OWL_PROTOCOL_AIM            1
104#define OWL_PROTOCOL_JABBER         2
105#define OWL_PROTOCOL_ICQ            3
106#define OWL_PROTOCOL_YAHOO          4
107#define OWL_PROTOCOL_MSN            5
108
109#define OWL_MESSAGE_TYPE_ADMIN      0
110#define OWL_MESSAGE_TYPE_GENERIC    1
111#define OWL_MESSAGE_TYPE_ZEPHYR     2
112#define OWL_MESSAGE_TYPE_AIM        3
113#define OWL_MESSAGE_TYPE_JABBER     4
114#define OWL_MESSAGE_TYPE_ICQ        5
115#define OWL_MESSAGE_TYPE_YAHOO      6
116#define OWL_MESSAGE_TYPE_MSN        7
117#define OWL_MESSAGE_TYPE_LOOPBACK   8
118
119#define OWL_MESSAGE_DIRECTION_NONE  0
120#define OWL_MESSAGE_DIRECTION_IN    1
121#define OWL_MESSAGE_DIRECTION_OUT   2
122
123#define OWL_MUX_READ   1
124#define OWL_MUX_WRITE  2
125#define OWL_MUX_EXCEPT 4
126
127#define OWL_DIRECTION_NONE      0
128#define OWL_DIRECTION_DOWNWARDS 1
129#define OWL_DIRECTION_UPWARDS   2
130
131#define OWL_LOGGING_DIRECTION_BOTH 0
132#define OWL_LOGGING_DIRECTION_IN   1
133#define OWL_LOGGING_DIRECTION_OUT  2
134
135#define OWL_SCROLLMODE_NORMAL      0
136#define OWL_SCROLLMODE_TOP         1
137#define OWL_SCROLLMODE_NEARTOP     2
138#define OWL_SCROLLMODE_CENTER      3
139#define OWL_SCROLLMODE_PAGED       4
140#define OWL_SCROLLMODE_PAGEDCENTER 5
141
142#define OWL_STYLE_TYPE_INTERNAL  0
143#define OWL_STYLE_TYPE_PERL      1
144
145#define OWL_TAB               3  /* This *HAS* to be the size of TABSTR below */
146#define OWL_TABSTR        "   "
147#define OWL_MSGTAB            7
148#define OWL_TYPWIN_SIZE       8
149#define OWL_HISTORYSIZE       50
150
151/* Indicate current state, as well as what is allowed */
152#define OWL_CTX_ANY          0xffff
153/* Only one of these may be active at a time... */
154#define OWL_CTX_MODE_BITS    0x000f
155#define OWL_CTX_STARTUP      0x0001
156#define OWL_CTX_READCONFIG   0x0002
157#define OWL_CTX_INTERACTIVE  0x0004
158/* Only one of these may be active at a time... */
159#define OWL_CTX_ACTIVE_BITS  0xfff0
160#define OWL_CTX_POPWIN       0x00f0
161#define OWL_CTX_POPLESS      0x0010
162#define OWL_CTX_RECWIN       0x0f00
163#define OWL_CTX_RECV         0x0100
164#define OWL_CTX_TYPWIN       0xf000
165#define OWL_CTX_EDIT         0x7000
166#define OWL_CTX_EDITLINE     0x1000
167#define OWL_CTX_EDITMULTI    0x2000
168#define OWL_CTX_EDITRESPONSE 0x4000
169
170#define OWL_USERCLUE_NONE       0
171#define OWL_USERCLUE_CLASSES    1
172#define OWL_USERCLUE_FOOBAR     2
173#define OWL_USERCLUE_BAZ        4
174
175#define OWL_WEBBROWSER_NONE     0
176#define OWL_WEBBROWSER_NETSCAPE 1
177#define OWL_WEBBROWSER_GALEON   2
178#define OWL_WEBBROWSER_OPERA    3
179
180#define OWL_VARIABLE_OTHER      0
181#define OWL_VARIABLE_INT        1
182#define OWL_VARIABLE_BOOL       2
183#define OWL_VARIABLE_STRING     3
184
185#define OWL_FILTER_MAX_DEPTH    300
186
187#define OWL_KEYMAP_MAXSTACK     20
188
189#define OWL_KEYBINDING_COMMAND  1   /* command string */
190#define OWL_KEYBINDING_FUNCTION 2   /* function taking no args */
191
192#define OWL_DEFAULT_ZAWAYMSG    "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
193#define OWL_DEFAULT_AAWAYMSG    "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
194
195#define OWL_INCLUDE_REG_TESTS   1  /* whether to build in regression tests */
196
197#define OWL_CMD_ALIAS_SUMMARY_PREFIX "command alias to: "
198
199#define OWL_WEBZEPHYR_PRINCIPAL "daemon.webzephyr"
200#define OWL_WEBZEPHYR_CLASS     "webzephyr"
201#define OWL_WEBZEPHYR_OPCODE    "webzephyr"
202
203#define OWL_REGEX_QUOTECHARS    "+*.?[]^\\"
204#define OWL_REGEX_QUOTEWITH     "\\"
205
206#if defined(HAVE_DES_STRING_TO_KEY) && defined(HAVE_DES_KEY_SCHED) && defined(HAVE_DES_ECB_ENCRYPT)
207#define OWL_ENABLE_ZCRYPT 1
208#endif
209
210#define OWL_META(key) ((key)|0200)
211/* OWL_CTRL is definied in kepress.c */
212
213#define LINE 2048
214
215typedef struct _owl_variable {
216  char *name;
217  int   type;  /* OWL_VARIABLE_* */
218  void *pval_default;  /* for types other and string */
219  int   ival_default;  /* for types int and bool     */
220  char *validsettings;          /* documentation of valid settings */
221  char *summary;                /* summary of usage */
222  char *description;            /* detailed description */
223  void *val;                    /* current value */
224  int  (*validate_fn)(struct _owl_variable *v, void *newval);
225                                /* returns 1 if newval is valid */
226  int  (*set_fn)(struct _owl_variable *v, void *newval); 
227                                /* sets the variable to a value
228                                 * of the appropriate type.
229                                 * unless documented, this
230                                 * should make a copy.
231                                 * returns 0 on success. */
232  int  (*set_fromstring_fn)(struct _owl_variable *v, char *newval);
233                                /* sets the variable to a value
234                                 * of the appropriate type.
235                                 * unless documented, this
236                                 * should make a copy.
237                                 * returns 0 on success. */
238  void *(*get_fn)(struct _owl_variable *v);
239                                /* returns a reference to the current value.
240                                 * WARNING:  this approach is hard to make
241                                 * thread-safe... */
242  int  (*get_tostring_fn)(struct _owl_variable *v, 
243                          char *buf, int bufsize, void *val); 
244                                /* converts val to a string
245                                 * and puts into buf */
246  void  (*free_fn)(struct _owl_variable *v);
247                                /* frees val as needed */
248} owl_variable;
249
250typedef struct _owl_fmtext {
251  int textlen;
252  char *textbuff;
253  char *fmbuff;
254  char *fgcolorbuff;
255  char *bgcolorbuff;
256} owl_fmtext;
257
258typedef struct _owl_list {
259  int size;
260  int avail;
261  void **list;
262} owl_list;
263
264typedef struct _owl_dict_el {
265  char *k;                      /* key   */
266  void *v;                      /* value */
267} owl_dict_el;
268
269typedef struct _owl_dict {
270  int size;
271  int avail;
272  owl_dict_el *els;             /* invariant: sorted by k */
273} owl_dict;
274typedef owl_dict owl_vardict;   /* dict of variables */
275typedef owl_dict owl_cmddict;   /* dict of commands */
276
277typedef struct _owl_context {
278  int   mode;
279  void *data;           /* determined by mode */
280} owl_context;
281
282typedef struct _owl_cmd {       /* command */
283  char *name;
284
285  char *summary;                /* one line summary of command */
286  char *usage;                  /* usage synopsis */
287  char *description;            /* long description of command */
288
289  int validctx;                 /* bitmask of valid contexts */
290
291  /* we should probably have a type here that says which of
292   * the following is valid, and maybe make the below into a union... */
293
294  /* Only one of these may be non-NULL ... */
295
296  char *cmd_aliased_to;         /* what this command is aliased to... */
297 
298  /* These don't take any context */
299  char *(*cmd_args_fn)(int argc, char **argv, char *buff); 
300                                /* takes argv and the full command as buff.
301                                 * caller must free return value if !NULL */
302  void (*cmd_v_fn)(void);       /* takes no args */
303  void (*cmd_i_fn)(int i);      /* takes an int as an arg */
304
305  /* The following also take the active context if it's valid */
306  char *(*cmd_ctxargs_fn)(void *ctx, int argc, char **argv, char *buff); 
307                                /* takes argv and the full command as buff.
308                                 * caller must free return value if !NULL */
309  void (*cmd_ctxv_fn)(void *ctx);               /* takes no args */
310  void (*cmd_ctxi_fn)(void *ctx, int i);        /* takes an int as an arg */
311  SV *cmd_perl;                                /* Perl closure that takes a list of args */
312} owl_cmd;
313
314
315typedef struct _owl_zwrite {
316  char *class;
317  char *inst;
318  char *realm;
319  char *opcode;
320  char *zsig;
321  char *message;
322  owl_list recips;
323  int cc;
324  int noping;
325} owl_zwrite;
326
327typedef struct _owl_pair {
328  void *key;
329  void *value;
330} owl_pair;
331
332typedef struct _owl_message {
333  int id;
334  int type;
335  int direction;
336#ifdef HAVE_LIBZEPHYR
337  ZNotice_t notice;
338#endif
339  owl_fmtext fmtext;              /* this is now only a CACHED copy */
340  int invalid_format;             /* indicates whether fmtext needs to be regenerated */
341  int delete;
342  char *hostname;
343  owl_list attributes;            /* this is a list of pairs */
344  char *timestr;
345  time_t time;
346  char *zwriteline;
347} owl_message;
348
349typedef struct _owl_style {
350  char *name;
351  char *description;
352  int type;
353  char *perlfuncname;
354  void (*formatfunc) (owl_fmtext *fm, owl_message *m);
355} owl_style;
356
357typedef struct _owl_mainwin {
358  int curtruncated;
359  int lasttruncated;
360  int lastdisplayed;
361} owl_mainwin;
362
363typedef struct _owl_viewwin {
364  owl_fmtext fmtext;
365  int textlines;
366  int topline;
367  int rightshift;
368  int winlines, wincols;
369  WINDOW *curswin;
370  void (*onclose_hook) (struct _owl_viewwin *vwin, void *data);
371  void *onclose_hook_data;
372} owl_viewwin;
373 
374typedef struct _owl_popwin {
375  WINDOW *borderwin;
376  WINDOW *popwin;
377  int lines;
378  int cols;
379  int active;
380  int needsfirstrefresh;
381  void (*handler) (int ch);
382} owl_popwin;
383
384typedef struct _owl_popexec {
385  int refcount;
386  owl_viewwin *vwin;
387  int winactive;
388  int pid;                      /* or 0 if it has terminated */
389  int rfd; 
390} owl_popexec;
391
392typedef struct _owl_messagelist {
393  owl_list list;
394} owl_messagelist;
395
396typedef struct _owl_regex {
397  int negate;
398  char *string;
399  regex_t re;
400} owl_regex;
401
402typedef struct _owl_filterelement {
403  int (*match_message)(struct _owl_filterelement *fe, owl_message *m);
404  /* Append a string representation of the filterelement onto buf*/
405  void (*print_elt)(struct _owl_filterelement *fe, char * buf);
406  /* Operands for and,or,not*/
407  struct _owl_filterelement *left, *right;
408  /* For regex filters*/
409  owl_regex re;
410  /* Used by regexes, filter references, and perl */
411  char *field;
412} owl_filterelement;
413
414typedef struct _owl_filter {
415  char *name;
416  int polarity;
417  owl_filterelement * root;
418  int fgcolor;
419  int bgcolor;
420  int cachedmsgid;  /* cached msgid: should move into view eventually */
421} owl_filter;
422
423typedef struct _owl_view {
424  char *name;
425  owl_filter *filter;
426  owl_messagelist ml;
427  owl_style *style;
428} owl_view;
429
430typedef struct _owl_history {
431  owl_list hist;
432  int cur;
433  int touched;
434  int partial;
435  int repeats;
436} owl_history;
437
438typedef struct _owl_editwin {
439  char *buff;
440  owl_history *hist;
441  int bufflen;
442  int allocated;
443  int buffx, buffy;
444  int topline;
445  int winlines, wincols, fillcol, wrapcol;
446  WINDOW *curswin;
447  int style;
448  int lock;
449  int dotsend;
450  int echochar;
451
452  char *command;
453  void (*callback)(struct _owl_editwin*);
454  void *cbdata;
455} owl_editwin;
456
457typedef struct _owl_mux {
458  int handle;                   /* for referencing this */
459  int active;                   /* has this been deleted? */
460  int fd;                     
461  int eventmask;                /* bitmask of OWL_MUX_* */
462  void (*handler_fn)(int handle, int fd, int eventmask, void *data);
463  void *data;                   /* data reference to pass to callback */
464} owl_mux;
465typedef owl_list owl_muxevents;
466
467typedef struct _owl_keybinding {
468  int  *j;                      /* keypress stack (0-terminated) */ 
469  int   type;                   /* command or function? */
470  char *desc;                   /* description (or "*user*") */
471  char *command;                /* command, if of type command */
472  void (*function_fn)(void);    /* function ptr, if of type function */
473} owl_keybinding;
474
475typedef struct _owl_keymap {
476  char     *name;               /* name of keymap */
477  char     *desc;               /* description */
478  owl_list  bindings;           /* key bindings */
479  struct _owl_keymap *submap;   /* submap */
480  void (*default_fn)(int j);    /* default action (takes a keypress) */
481  void (*prealways_fn)(int j);  /* always called before a keypress is received */
482  void (*postalways_fn)(int j); /* always called after keypress is processed */
483} owl_keymap;
484
485typedef struct _owl_keyhandler {
486  owl_dict  keymaps;            /* dictionary of keymaps */
487  owl_keymap *active;           /* currently active keymap */
488  int       in_esc;             /* escape pressed? */
489  int       kpstack[OWL_KEYMAP_MAXSTACK+1]; /* current stack of keypresses */
490  int       kpstackpos;         /* location in stack (-1 = none) */
491} owl_keyhandler;
492
493typedef struct _owl_buddy {
494  int proto;
495  char *name;
496  int isidle;
497  int idlesince;
498} owl_buddy;
499
500typedef struct _owl_buddylist {
501  owl_list buddies;
502} owl_buddylist;
503
504typedef struct _owl_zbuddylist {
505  owl_list zusers;
506} owl_zbuddylist;
507
508typedef struct _owl_timer {
509  int direction;
510  time_t starttime;
511  int start;
512} owl_timer;
513
514typedef struct _owl_errqueue {
515  owl_list errlist;
516} owl_errqueue;
517
518typedef struct _owl_colorpair_mgr {
519  char *used;
520  int **pairs;
521} owl_colorpair_mgr;
522
523typedef struct _owl_global {
524  owl_mainwin mw;
525  owl_popwin pw;
526  owl_history cmdhist;          /* command history */
527  owl_history msghist;          /* outgoing message history */
528  owl_keyhandler kh;
529  owl_list filterlist;
530  owl_list puntlist;
531  owl_muxevents muxevents;      /* fds to dispatch on */
532  owl_vardict vars;
533  owl_cmddict cmds;
534  owl_context ctx;
535  owl_errqueue errqueue;
536  int lines, cols;
537  int curmsg, topmsg;
538  int curmsg_vert_offset;
539  owl_view current_view;
540  owl_messagelist msglist;
541  WINDOW *recwin, *sepwin, *msgwin, *typwin;
542  int needrefresh;
543  int rightshift;
544  int resizepending;
545  int recwinlines;
546  int typwinactive;
547  char *thishost;
548  char *homedir;
549  int direction;
550  int zaway;
551  char *cur_zaway_msg;
552  int haveconfig;
553  int config_format;
554  void *buffercbdata;
555  owl_editwin tw;
556  owl_viewwin vw;
557  void *perl;
558  int debug;
559  int starttime;
560  char *startupargs;
561  int userclue;
562  int nextmsgid;
563  int hascolors;
564  int colorpairs;
565  owl_colorpair_mgr cpmgr;
566  int searchactive;
567  int newmsgproc_pid;
568  int malloced, freed;
569  char *searchstring;
570  aim_session_t aimsess;
571  aim_conn_t bosconn;
572  owl_timer aim_noop_timer;
573  owl_timer aim_ignorelogin_timer;
574  owl_timer aim_buddyinfo_timer;
575  int aim_loggedin;         /* true if currently logged into AIM */
576  int aim_doprocessing;     /* true if we should process AIM events (like pending login) */
577  char *aim_screenname;     /* currently logged in AIM screen name */
578  owl_buddylist buddylist;  /* list of logged in AIM buddies */
579  owl_list messagequeue;    /* for queueing up aim and other messages */
580  owl_dict styledict;       /* global dictionary of available styles */
581  char *response;           /* response to the last question asked */
582  int havezephyr;
583  int haveaim;
584  int got_err_signal;       /* 1 if we got an unexpected signal */
585  siginfo_t err_signal_info;
586  owl_zbuddylist zbuddies;
587  owl_timer zephyr_buddycheck_timer;
588  struct termios startup_tio;
589} owl_global;
590
591/* globals */
592extern owl_global g;
593
594#include "owl_prototypes.h"
595
596/* these are missing from the zephyr includes for some reason */
597#ifdef HAVE_LIBZEPHYR
598int ZGetSubscriptions(ZSubscription_t *, int *);
599int ZGetLocations(ZLocations_t *,int *);
600#endif
601
602#endif /* INC_OWL_H */
Note: See TracBrowser for help on using the repository browser.