source: owl.h @ 3e36085

release-1.10release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since 3e36085 was a556caa, checked in by Nelson Elhage <nelhage@mit.edu>, 15 years ago
Mostly refactor the editwin to use a linear buffer position. Use a linear buffer positino to keep track of the point, rather than (x, y). In addition, make the editwin structure private to editwin.c. (No abstraction violation for you!) Add some abstractions for pointer movement, and use them in some places.
  • Property mode set to 100644
File size: 16.6 KB
Line 
1/*  Copyright (c) 2006-2009 The BarnOwl Developers. All rights reserved.
2 *  Copyright (c) 2004 James Kretchmar. All rights reserved.
3 *
4 *  This program is free software. You can redistribute it and/or
5 *  modify under the terms of the Sleepycat License. See the COPYING
6 *  file included with the distribution for more information.
7 */
8
9#ifndef INC_OWL_H
10#define INC_OWL_H
11
12#ifndef OWL_PERL
13#include <curses.h>
14#endif
15#include <sys/param.h>
16#include <EXTERN.h>
17#include <netdb.h>
18#include <regex.h>
19#include <time.h>
20#include <signal.h>
21#include <termios.h>
22#include "libfaim/aim.h"
23#include <wchar.h>
24#include "config.h"
25#include "glib.h"
26#ifdef HAVE_LIBZEPHYR
27#include <zephyr/zephyr.h>
28#endif
29#ifdef HAVE_COM_ERR_H
30#include <com_err.h>
31#endif
32
33/* Perl and curses don't play nice. */
34#ifdef OWL_PERL
35typedef void WINDOW;
36/* logout is defined in FreeBSD. */
37#define logout logout_
38/* aim.h defines bool */
39#define HAS_BOOL
40#include <perl.h>
41#include "owl_perl.h"
42#undef logout
43#include "XSUB.h"
44#else
45typedef void SV;
46#endif
47
48static const char owl_h_fileIdent[] = "$Id$";
49
50#define BARNOWL_STRINGIFY(x) _STRINGIFY(x)
51#define _STRINGIFY(x) #x
52
53#ifndef OWL_VERSION_STRING
54#define OWL_VERSION_STRING "1.3"
55#endif
56
57/* Feature that is being tested to redirect stderr through a pipe.
58 * There may still be some portability problems with this. */
59#define OWL_STDERR_REDIR 1
60
61#define OWL_DEBUG 0
62#define OWL_DEBUG_FILE "/var/tmp/owldebug"
63
64#define OWL_CONFIG_DIR "/.owl"             /* this is relative to the user's home directory */
65#define OWL_STARTUP_FILE "/.owl/startup"   /* this is relative to the user's home directory */
66
67#define OWL_FMTEXT_ATTR_NONE      0
68#define OWL_FMTEXT_ATTR_BOLD      1
69#define OWL_FMTEXT_ATTR_REVERSE   2
70#define OWL_FMTEXT_ATTR_UNDERLINE 4
71
72#define OWL_FMTEXT_UC_BASE 0x100000 /* Unicode Plane 16 - Supplementary Private Use Area-B*/
73#define OWL_FMTEXT_UC_ATTR ( OWL_FMTEXT_UC_BASE | 0x800 )
74#define OWL_FMTEXT_UC_ATTR_MASK 0x7
75#define OWL_FMTEXT_UC_COLOR_BASE ( OWL_FMTEXT_UC_BASE | 0x400 )
76#define OWL_FMTEXT_UC_FGCOLOR OWL_FMTEXT_UC_COLOR_BASE
77#define OWL_FMTEXT_UC_BGCOLOR ( OWL_FMTEXT_UC_COLOR_BASE | 0x200 )
78#define OWL_FMTEXT_UC_DEFAULT_COLOR 0x100
79#define OWL_FMTEXT_UC_FGDEFAULT ( OWL_FMTEXT_UC_FGCOLOR | OWL_FMTEXT_UC_DEFAULT_COLOR )
80#define OWL_FMTEXT_UC_BGDEFAULT ( OWL_FMTEXT_UC_BGCOLOR | OWL_FMTEXT_UC_DEFAULT_COLOR )
81#define OWL_FMTEXT_UC_COLOR_MASK 0xFF
82#define OWL_FMTEXT_UC_ALLCOLOR_MASK ( OWL_FMTEXT_UC_COLOR_MASK | OWL_FMTEXT_UC_DEFAULT_COLOR | 0x200)
83#define OWL_FMTEXT_UC_STARTBYTE_UTF8 '\xf4'
84
85#define OWL_FMTEXT_UTF8_ATTR_NONE "\xf4\x80\xa0\x80"
86#define OWL_FMTEXT_UTF8_FGDEFAULT "\xf4\x80\x94\x80"
87#define OWL_FMTEXT_UTF8_BGDEFAULT "\xf4\x80\x9C\x80"
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   -1
98#define OWL_COLOR_INVALID   -2
99
100#define OWL_EDITWIN_STYLE_MULTILINE 0
101#define OWL_EDITWIN_STYLE_ONELINE   1
102
103#define OWL_PROTOCOL_ZEPHYR         0
104#define OWL_PROTOCOL_AIM            1
105#define OWL_PROTOCOL_JABBER         2
106#define OWL_PROTOCOL_ICQ            3
107#define OWL_PROTOCOL_YAHOO          4
108#define OWL_PROTOCOL_MSN            5
109
110#define OWL_MESSAGE_DIRECTION_NONE  0
111#define OWL_MESSAGE_DIRECTION_IN    1
112#define OWL_MESSAGE_DIRECTION_OUT   2
113
114#define OWL_MUX_READ   1
115#define OWL_MUX_WRITE  2
116#define OWL_MUX_EXCEPT 4
117
118#define OWL_DIRECTION_NONE      0
119#define OWL_DIRECTION_DOWNWARDS 1
120#define OWL_DIRECTION_UPWARDS   2
121
122#define OWL_LOGGING_DIRECTION_BOTH 0
123#define OWL_LOGGING_DIRECTION_IN   1
124#define OWL_LOGGING_DIRECTION_OUT  2
125
126#define OWL_SCROLLMODE_NORMAL      0
127#define OWL_SCROLLMODE_TOP         1
128#define OWL_SCROLLMODE_NEARTOP     2
129#define OWL_SCROLLMODE_CENTER      3
130#define OWL_SCROLLMODE_PAGED       4
131#define OWL_SCROLLMODE_PAGEDCENTER 5
132
133#define OWL_TAB               3  /* This *HAS* to be the size of TABSTR below */
134#define OWL_TABSTR        "   "
135#define OWL_MSGTAB            7
136#define OWL_TYPWIN_SIZE       8
137#define OWL_HISTORYSIZE       50
138
139/* Indicate current state, as well as what is allowed */
140#define OWL_CTX_ANY          0xffff
141/* Only one of these may be active at a time... */
142#define OWL_CTX_MODE_BITS    0x000f
143#define OWL_CTX_STARTUP      0x0001
144#define OWL_CTX_READCONFIG   0x0002
145#define OWL_CTX_INTERACTIVE  0x0004
146/* Only one of these may be active at a time... */
147#define OWL_CTX_ACTIVE_BITS  0xfff0
148#define OWL_CTX_POPWIN       0x00f0
149#define OWL_CTX_POPLESS      0x0010
150#define OWL_CTX_RECWIN       0x0f00
151#define OWL_CTX_RECV         0x0100
152#define OWL_CTX_TYPWIN       0xf000
153#define OWL_CTX_EDIT         0x7000
154#define OWL_CTX_EDITLINE     0x1000
155#define OWL_CTX_EDITMULTI    0x2000
156#define OWL_CTX_EDITRESPONSE 0x4000
157
158#define OWL_USERCLUE_NONE       0
159#define OWL_USERCLUE_CLASSES    1
160#define OWL_USERCLUE_FOOBAR     2
161#define OWL_USERCLUE_BAZ        4
162
163#define OWL_WEBBROWSER_NONE     0
164#define OWL_WEBBROWSER_NETSCAPE 1
165#define OWL_WEBBROWSER_GALEON   2
166#define OWL_WEBBROWSER_OPERA    3
167
168#define OWL_VARIABLE_OTHER      0
169#define OWL_VARIABLE_INT        1
170#define OWL_VARIABLE_BOOL       2
171#define OWL_VARIABLE_STRING     3
172
173#define OWL_FILTER_MAX_DEPTH    300
174
175#define OWL_KEYMAP_MAXSTACK     20
176
177#define OWL_KEYBINDING_COMMAND  1   /* command string */
178#define OWL_KEYBINDING_FUNCTION 2   /* function taking no args */
179
180#define OWL_DEFAULT_ZAWAYMSG    "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
181#define OWL_DEFAULT_AAWAYMSG    "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
182
183#define OWL_INCLUDE_REG_TESTS   1  /* whether to build in regression tests */
184
185#define OWL_CMD_ALIAS_SUMMARY_PREFIX "command alias to: "
186
187#define OWL_WEBZEPHYR_PRINCIPAL "daemon.webzephyr"
188#define OWL_WEBZEPHYR_CLASS     "webzephyr"
189#define OWL_WEBZEPHYR_OPCODE    "webzephyr"
190
191#define OWL_REGEX_QUOTECHARS    "+*.?[]^\\${}()"
192#define OWL_REGEX_QUOTEWITH     "\\"
193
194#if defined(HAVE_DES_STRING_TO_KEY) && defined(HAVE_DES_KEY_SCHED) && defined(HAVE_DES_ECB_ENCRYPT)
195#define OWL_ENABLE_ZCRYPT 1
196#endif
197
198#define OWL_META(key) ((key)|010000)
199/* OWL_CTRL is definied in kepress.c */
200
201#define LINE 2048
202
203typedef struct _owl_variable {
204  char *name;
205  int   type;  /* OWL_VARIABLE_* */
206  void *pval_default;  /* for types other and string */
207  int   ival_default;  /* for types int and bool     */
208  char *validsettings;          /* documentation of valid settings */
209  char *summary;                /* summary of usage */
210  char *description;            /* detailed description */
211  void *val;                    /* current value */
212  int  (*validate_fn)(struct _owl_variable *v, void *newval);
213                                /* returns 1 if newval is valid */
214  int  (*set_fn)(struct _owl_variable *v, void *newval); 
215                                /* sets the variable to a value
216                                 * of the appropriate type.
217                                 * unless documented, this
218                                 * should make a copy.
219                                 * returns 0 on success. */
220  int  (*set_fromstring_fn)(struct _owl_variable *v, char *newval);
221                                /* sets the variable to a value
222                                 * of the appropriate type.
223                                 * unless documented, this
224                                 * should make a copy.
225                                 * returns 0 on success. */
226  void *(*get_fn)(struct _owl_variable *v);
227                                /* returns a reference to the current value.
228                                 * WARNING:  this approach is hard to make
229                                 * thread-safe... */
230  int  (*get_tostring_fn)(struct _owl_variable *v, 
231                          char *buf, int bufsize, void *val); 
232                                /* converts val to a string
233                                 * and puts into buf */
234  void  (*free_fn)(struct _owl_variable *v);
235                                /* frees val as needed */
236} owl_variable;
237
238typedef struct _owl_input {
239  int ch;
240  gunichar uch;
241} owl_input;
242
243typedef struct _owl_fmtext {
244  int textlen;
245  int bufflen;
246  char *textbuff;
247  char default_attrs;
248  short default_fgcolor;
249  short default_bgcolor;
250} owl_fmtext;
251
252typedef struct _owl_list {
253  int size;
254  int avail;
255  void **list;
256} owl_list;
257
258typedef struct _owl_dict_el {
259  char *k;                      /* key   */
260  void *v;                      /* value */
261} owl_dict_el;
262
263typedef struct _owl_dict {
264  int size;
265  int avail;
266  owl_dict_el *els;             /* invariant: sorted by k */
267} owl_dict;
268typedef owl_dict owl_vardict;   /* dict of variables */
269typedef owl_dict owl_cmddict;   /* dict of commands */
270
271typedef struct _owl_context {
272  int   mode;
273  void *data;           /* determined by mode */
274} owl_context;
275
276typedef struct _owl_cmd {       /* command */
277  char *name;
278
279  char *summary;                /* one line summary of command */
280  char *usage;                  /* usage synopsis */
281  char *description;            /* long description of command */
282
283  int validctx;                 /* bitmask of valid contexts */
284
285  /* we should probably have a type here that says which of
286   * the following is valid, and maybe make the below into a union... */
287
288  /* Only one of these may be non-NULL ... */
289
290  char *cmd_aliased_to;         /* what this command is aliased to... */
291 
292  /* These don't take any context */
293  char *(*cmd_args_fn)(int argc, char **argv, char *buff); 
294                                /* takes argv and the full command as buff.
295                                 * caller must free return value if !NULL */
296  void (*cmd_v_fn)(void);       /* takes no args */
297  void (*cmd_i_fn)(int i);      /* takes an int as an arg */
298
299  /* The following also take the active context if it's valid */
300  char *(*cmd_ctxargs_fn)(void *ctx, int argc, char **argv, char *buff); 
301                                /* takes argv and the full command as buff.
302                                 * caller must free return value if !NULL */
303  void (*cmd_ctxv_fn)(void *ctx);               /* takes no args */
304  void (*cmd_ctxi_fn)(void *ctx, int i);        /* takes an int as an arg */
305  SV *cmd_perl;                                /* Perl closure that takes a list of args */
306} owl_cmd;
307
308
309typedef struct _owl_zwrite {
310  char *class;
311  char *inst;
312  char *realm;
313  char *opcode;
314  char *zsig;
315  char *message;
316  owl_list recips;
317  int cc;
318  int noping;
319} owl_zwrite;
320
321typedef struct _owl_pair {
322  char *key;
323  char *value;
324} owl_pair;
325
326struct _owl_fmtext_cache;
327
328typedef struct _owl_message {
329  int id;
330  int direction;
331#ifdef HAVE_LIBZEPHYR
332  ZNotice_t notice;
333#endif
334  struct _owl_fmtext_cache * fmtext;
335  int delete;
336  char *hostname;
337  owl_list attributes;            /* this is a list of pairs */
338  char *timestr;
339  time_t time;
340} owl_message;
341
342#define OWL_FMTEXT_CACHE_SIZE 1000
343/* We cache the saved fmtexts for the last bunch of messages we
344   rendered */
345typedef struct _owl_fmtext_cache {
346    owl_message * message;
347    owl_fmtext fmtext;
348} owl_fmtext_cache;
349
350typedef struct _owl_style {
351  char *name;
352  SV *perlobj;
353} owl_style;
354
355typedef struct _owl_mainwin {
356  int curtruncated;
357  int lasttruncated;
358  int lastdisplayed;
359} owl_mainwin;
360
361typedef struct _owl_viewwin {
362  owl_fmtext fmtext;
363  int textlines;
364  int topline;
365  int rightshift;
366  int winlines, wincols;
367  WINDOW *curswin;
368  void (*onclose_hook) (struct _owl_viewwin *vwin, void *data);
369  void *onclose_hook_data;
370} owl_viewwin;
371 
372typedef struct _owl_popwin {
373  WINDOW *borderwin;
374  WINDOW *popwin;
375  int lines;
376  int cols;
377  int active;
378  int needsfirstrefresh;
379} owl_popwin;
380
381typedef struct _owl_messagelist {
382  owl_list list;
383} owl_messagelist;
384
385typedef struct _owl_regex {
386  int negate;
387  char *string;
388  regex_t re;
389} owl_regex;
390
391typedef struct _owl_filterelement {
392  int (*match_message)(struct _owl_filterelement *fe, owl_message *m);
393  /* Append a string representation of the filterelement onto buf*/
394  void (*print_elt)(struct _owl_filterelement *fe, GString *buf);
395  /* Operands for and,or,not*/
396  struct _owl_filterelement *left, *right;
397  /* For regex filters*/
398  owl_regex re;
399  /* Used by regexes, filter references, and perl */
400  char *field;
401} owl_filterelement;
402
403typedef struct _owl_filter {
404  char *name;
405  owl_filterelement * root;
406  int fgcolor;
407  int bgcolor;
408  int cachedmsgid;  /* cached msgid: should move into view eventually */
409} owl_filter;
410
411typedef struct _owl_view {
412  char *name;
413  owl_filter *filter;
414  owl_messagelist ml;
415  owl_style *style;
416} owl_view;
417
418typedef struct _owl_history {
419  owl_list hist;
420  int cur;
421  int touched;
422  int partial;
423  int repeats;
424} owl_history;
425
426typedef struct _owl_editwin owl_editwin;
427
428typedef struct _owl_keybinding {
429  int  *keys;                   /* keypress stack */
430  int   len;                    /* length of stack */
431  int   type;                   /* command or function? */
432  char *desc;                   /* description (or "*user*") */
433  char *command;                /* command, if of type command */
434  void (*function_fn)(void);    /* function ptr, if of type function */
435} owl_keybinding;
436
437typedef struct _owl_keymap {
438  char     *name;               /* name of keymap */
439  char     *desc;               /* description */
440  owl_list  bindings;           /* key bindings */
441  struct _owl_keymap *submap;   /* submap */
442  void (*default_fn)(owl_input j);      /* default action (takes a keypress) */
443  void (*prealways_fn)(owl_input  j);   /* always called before a keypress is received */
444  void (*postalways_fn)(owl_input  j);  /* always called after keypress is processed */
445} owl_keymap;
446
447typedef struct _owl_keyhandler {
448  owl_dict  keymaps;            /* dictionary of keymaps */
449  owl_keymap *active;           /* currently active keymap */
450  int       in_esc;             /* escape pressed? */
451  int       kpstack[OWL_KEYMAP_MAXSTACK+1]; /* current stack of keypresses */
452  int       kpstackpos;         /* location in stack (-1 = none) */
453} owl_keyhandler;
454
455typedef struct _owl_buddy {
456  int proto;
457  char *name;
458  int isidle;
459  int idlesince;
460} owl_buddy;
461
462typedef struct _owl_buddylist {
463  owl_list buddies;
464} owl_buddylist;
465
466typedef struct _owl_zbuddylist {
467  owl_list zusers;
468} owl_zbuddylist;
469
470typedef struct _owl_timer {
471  time_t time;
472  int interval;
473  void (*callback)(struct _owl_timer *, void *);
474  void (*destroy)(struct _owl_timer *);
475  void *data;
476} owl_timer;
477
478typedef struct _owl_errqueue {
479  owl_list errlist;
480} owl_errqueue;
481
482typedef struct _owl_colorpair_mgr {
483  int next;
484  short **pairs;
485} owl_colorpair_mgr;
486
487typedef struct _owl_obarray {
488  owl_list strings;
489} owl_obarray;
490
491typedef struct _owl_dispatch {
492  int fd;                                 /* FD to watch for dispatch. */
493  int needs_gc;
494  void (*cfunc)(struct _owl_dispatch*);   /* C function to dispatch to. */
495  void (*destroy)(struct _owl_dispatch*); /* Destructor */
496  void *data;
497} owl_dispatch;
498
499typedef struct _owl_popexec {
500  int refcount;
501  owl_viewwin *vwin;
502  int winactive;
503  int pid;                      /* or 0 if it has terminated */
504  owl_dispatch dispatch;
505} owl_popexec;
506
507typedef struct _owl_global {
508  owl_mainwin mw;
509  owl_popwin pw;
510  owl_history cmdhist;          /* command history */
511  owl_history msghist;          /* outgoing message history */
512  owl_keyhandler kh;
513  owl_list filterlist;
514  owl_list puntlist;
515  owl_vardict vars;
516  owl_cmddict cmds;
517  owl_context ctx;
518  owl_errqueue errqueue;
519  int lines, cols;
520  int curmsg, topmsg;
521  int markedmsgid;              /* for finding the marked message when it has moved. */
522  int curmsg_vert_offset;
523  owl_view current_view;
524  owl_messagelist msglist;
525  WINDOW *recwin, *sepwin, *msgwin, *typwin;
526  int needrefresh;
527  int rightshift;
528  int resizepending;
529  int recwinlines;
530  int typwinactive;
531  char *thishost;
532  char *homedir;
533  char *confdir;
534  char *startupfile;
535  int direction;
536  int zaway;
537  char *cur_zaway_msg;
538  int haveconfig;
539  int config_format;
540  void *buffercbdata;
541  owl_editwin *tw;
542  owl_viewwin vw;
543  void *perl;
544  int debug;
545  time_t starttime;
546  time_t lastinputtime;
547  char *startupargs;
548  int userclue;
549  int nextmsgid;
550  int hascolors;
551  int colorpairs;
552  owl_colorpair_mgr cpmgr;
553  int searchactive;
554  int newmsgproc_pid;
555  int malloced, freed;
556  char *searchstring;
557  aim_session_t aimsess;
558  aim_conn_t bosconn;
559  owl_timer aim_noop_timer;
560  owl_timer aim_ignorelogin_timer;
561  int aim_loggedin;         /* true if currently logged into AIM */
562  int aim_doprocessing;     /* true if we should process AIM events (like pending login) */
563  char *aim_screenname;     /* currently logged in AIM screen name */
564  char *aim_screenname_for_filters;     /* currently logged in AIM screen name */
565  owl_buddylist buddylist;  /* list of logged in AIM buddies */
566  owl_list messagequeue;    /* for queueing up aim and other messages */
567  owl_dict styledict;       /* global dictionary of available styles */
568  char *response;           /* response to the last question asked */
569  int havezephyr;
570  int haveaim;
571  int ignoreaimlogin;
572  int got_err_signal;       /* 1 if we got an unexpected signal */
573  siginfo_t err_signal_info;
574  owl_zbuddylist zbuddies;
575  owl_timer zephyr_buddycheck_timer;
576  struct termios startup_tio;
577  owl_obarray obarray;
578  owl_list dispatchlist;
579  GList *timerlist;
580  owl_timer *aim_nop_timer;
581  int load_initial_subs;
582  int interrupted;
583} owl_global;
584
585/* globals */
586extern owl_global g;
587
588#include "owl_prototypes.h"
589
590/* these are missing from the zephyr includes for some reason */
591#ifdef HAVE_LIBZEPHYR
592int ZGetSubscriptions(ZSubscription_t *, int *);
593int ZGetLocations(ZLocations_t *,int *);
594#endif
595
596#endif /* INC_OWL_H */
Note: See TracBrowser for help on using the repository browser.