source: owl.h @ 35b6eb9

release-1.10release-1.8release-1.9
Last change on this file since 35b6eb9 was 099597c, checked in by David Benjamin <davidben@mit.edu>, 13 years ago
Don't reset colorpairs in the middle of drawing Resetting colorpairs while drawing the mainwin causes the existing contents in a popwin to refer to invalid color pairs. We used to draw the mainwin first and redraw the contents of each window from scratch. Moving to libpanel in 1.6 changed this, so background colors occasionally bled into your popwin. This changes the colorpair logic to only trigger when we need to, and to forcibly dirty every window if needed. NOTE: if we don't have enough color-pairs to draw the current screen, this will draw everything twice. But it will probably almost never happen. Reported-by: Alex Dehnert <adehnert@mit.edu> Reviewed-by: Alejandro R. Sedeño <asedeno@mit.edu>
  • Property mode set to 100644
File size: 18.5 KB
Line 
1/*  Copyright (c) 2006-2011 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_BARNOWL_OWL_H
10#define INC_BARNOWL_OWL_H
11
12#include "config.h"
13
14#include "compat/compat.h"
15
16#ifdef HAVE_STDBOOL_H
17#include <stdbool.h>
18#else
19#ifndef HAVE__BOOL
20#define _Bool signed char
21#endif
22#define bool _Bool
23#define false 0
24#define true 1
25#define __bool_true_false_are_defined 1
26#endif  /* HAVE_STDBOOL_H */
27
28#ifndef OWL_PERL
29#include <curses.h>
30#include <panel.h>
31#endif
32#include <sys/param.h>
33#include <EXTERN.h>
34#include <netdb.h>
35#include <regex.h>
36#include <time.h>
37#include <signal.h>
38#include <termios.h>
39#include "libfaim/aim.h"
40#include <wchar.h>
41#include "glib.h"
42#ifdef HAVE_LIBZEPHYR
43#include <zephyr/zephyr.h>
44#endif
45#ifdef HAVE_COM_ERR_H
46#include <com_err.h>
47#endif
48
49/* Perl and curses don't play nice. */
50#ifdef OWL_PERL
51typedef void WINDOW;
52typedef void PANEL;
53/* logout is defined in FreeBSD. */
54#define logout logout_
55#define HAS_BOOL
56#include <perl.h>
57#include "owl_perl.h"
58#undef logout
59#include "XSUB.h"
60#else
61typedef void SV;
62typedef void AV;
63typedef void HV;
64#endif
65
66#include "window.h"
67
68#ifdef  GIT_VERSION
69#define stringify(x)       __stringify(x)
70#define __stringify(x)     #x
71#define OWL_VERSION_STRING stringify(GIT_VERSION)
72#else
73#define OWL_VERSION_STRING PACKAGE_VERSION
74#endif
75
76/* Feature that is being tested to redirect stderr through a pipe.
77 * There may still be some portability problems with this. */
78#define OWL_STDERR_REDIR 1
79
80#define OWL_DEBUG 0
81#define OWL_DEBUG_FILE "/var/tmp/barnowl-debug"
82
83#define OWL_CONFIG_DIR "/.owl"             /* this is relative to the user's home directory */
84#define OWL_STARTUP_FILE "/.owl/startup"   /* this is relative to the user's home directory */
85
86#define OWL_FMTEXT_ATTR_NONE      0
87#define OWL_FMTEXT_ATTR_BOLD      1
88#define OWL_FMTEXT_ATTR_REVERSE   2
89#define OWL_FMTEXT_ATTR_UNDERLINE 4
90
91#define OWL_FMTEXT_UC_BASE 0x100000 /* Unicode Plane 16 - Supplementary Private Use Area-B*/
92#define OWL_FMTEXT_UC_ATTR ( OWL_FMTEXT_UC_BASE | 0x800 )
93#define OWL_FMTEXT_UC_ATTR_MASK 0x7
94#define OWL_FMTEXT_UC_COLOR_BASE ( OWL_FMTEXT_UC_BASE | 0x400 )
95#define OWL_FMTEXT_UC_FGCOLOR OWL_FMTEXT_UC_COLOR_BASE
96#define OWL_FMTEXT_UC_BGCOLOR ( OWL_FMTEXT_UC_COLOR_BASE | 0x200 )
97#define OWL_FMTEXT_UC_DEFAULT_COLOR 0x100
98#define OWL_FMTEXT_UC_FGDEFAULT ( OWL_FMTEXT_UC_FGCOLOR | OWL_FMTEXT_UC_DEFAULT_COLOR )
99#define OWL_FMTEXT_UC_BGDEFAULT ( OWL_FMTEXT_UC_BGCOLOR | OWL_FMTEXT_UC_DEFAULT_COLOR )
100#define OWL_FMTEXT_UC_COLOR_MASK 0xFF
101#define OWL_FMTEXT_UC_ALLCOLOR_MASK ( OWL_FMTEXT_UC_COLOR_MASK | OWL_FMTEXT_UC_DEFAULT_COLOR | 0x200)
102#define OWL_FMTEXT_UC_STARTBYTE_UTF8 '\xf4'
103
104#define OWL_FMTEXT_UTF8_ATTR_NONE "\xf4\x80\xa0\x80"
105#define OWL_FMTEXT_UTF8_FGDEFAULT "\xf4\x80\x94\x80"
106#define OWL_FMTEXT_UTF8_BGDEFAULT "\xf4\x80\x9C\x80"
107
108#define OWL_COLOR_BLACK     0
109#define OWL_COLOR_RED       1
110#define OWL_COLOR_GREEN     2
111#define OWL_COLOR_YELLOW    3
112#define OWL_COLOR_BLUE      4
113#define OWL_COLOR_MAGENTA   5
114#define OWL_COLOR_CYAN      6
115#define OWL_COLOR_WHITE     7
116#define OWL_COLOR_DEFAULT   -1
117#define OWL_COLOR_INVALID   -2
118
119#define OWL_TAB_WIDTH 8
120
121#define OWL_EDITWIN_STYLE_MULTILINE 0
122#define OWL_EDITWIN_STYLE_ONELINE   1
123
124#define OWL_PROTOCOL_ZEPHYR         0
125#define OWL_PROTOCOL_AIM            1
126#define OWL_PROTOCOL_JABBER         2
127#define OWL_PROTOCOL_ICQ            3
128#define OWL_PROTOCOL_YAHOO          4
129#define OWL_PROTOCOL_MSN            5
130
131#define OWL_MESSAGE_DIRECTION_NONE  0
132#define OWL_MESSAGE_DIRECTION_IN    1
133#define OWL_MESSAGE_DIRECTION_OUT   2
134
135#define OWL_IO_READ   1
136#define OWL_IO_WRITE  2
137#define OWL_IO_EXCEPT 4
138
139#define OWL_DIRECTION_NONE      0
140#define OWL_DIRECTION_DOWNWARDS 1
141#define OWL_DIRECTION_UPWARDS   2
142
143#define OWL_LOGGING_DIRECTION_BOTH 0
144#define OWL_LOGGING_DIRECTION_IN   1
145#define OWL_LOGGING_DIRECTION_OUT  2
146
147#define OWL_SCROLLMODE_NORMAL      0
148#define OWL_SCROLLMODE_TOP         1
149#define OWL_SCROLLMODE_NEARTOP     2
150#define OWL_SCROLLMODE_CENTER      3
151#define OWL_SCROLLMODE_PAGED       4
152#define OWL_SCROLLMODE_PAGEDCENTER 5
153
154#define OWL_TAB               3  /* This *HAS* to be the size of TABSTR below */
155#define OWL_TABSTR        "   "
156#define OWL_MSGTAB            7
157#define OWL_TYPWIN_SIZE       8
158#define OWL_HISTORYSIZE       50
159
160/* Indicate current state, as well as what is allowed */
161#define OWL_CTX_ANY          0xffff
162/* Only one of these may be active at a time... */
163#define OWL_CTX_MODE_BITS    0x000f
164#define OWL_CTX_STARTUP      0x0001
165#define OWL_CTX_READCONFIG   0x0002
166#define OWL_CTX_INTERACTIVE  0x0004
167/* Only one of these may be active at a time... */
168#define OWL_CTX_ACTIVE_BITS  0xfff0
169#define OWL_CTX_POPWIN       0x00f0
170#define OWL_CTX_POPLESS      0x0010
171#define OWL_CTX_RECWIN       0x0f00
172#define OWL_CTX_RECV         0x0100
173#define OWL_CTX_TYPWIN       0xf000
174#define OWL_CTX_EDIT         0x7000
175#define OWL_CTX_EDITLINE     0x1000
176#define OWL_CTX_EDITMULTI    0x2000
177#define OWL_CTX_EDITRESPONSE 0x4000
178
179#define OWL_VARIABLE_OTHER      0
180#define OWL_VARIABLE_INT        1
181#define OWL_VARIABLE_BOOL       2
182#define OWL_VARIABLE_STRING     3
183
184#define OWL_OUTPUT_RETURN       0
185#define OWL_OUTPUT_POPUP        1
186#define OWL_OUTPUT_ADMINMSG     2
187
188#define OWL_FILTER_MAX_DEPTH    300
189
190#define OWL_KEYMAP_MAXSTACK     20
191
192#define OWL_KEYBINDING_COMMAND  1   /* command string */
193#define OWL_KEYBINDING_FUNCTION 2   /* function taking no args */
194
195#define OWL_DEFAULT_ZAWAYMSG    "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
196#define OWL_DEFAULT_AAWAYMSG    "I'm sorry, but I am currently away from the terminal and am\nnot able to receive your message.\n"
197
198#define OWL_CMD_ALIAS_SUMMARY_PREFIX "command alias to: "
199
200#define OWL_WEBZEPHYR_PRINCIPAL "daemon/webzephyr.mit.edu"
201#define OWL_WEBZEPHYR_CLASS     "webzephyr"
202#define OWL_WEBZEPHYR_OPCODE    "webzephyr"
203
204#define OWL_ZEPHYR_NOSTRIP_HOST         "host/"
205#define OWL_ZEPHYR_NOSTRIP_RCMD         "rcmd."
206#define OWL_ZEPHYR_NOSTRIP_DAEMON5      "daemon/"
207#define OWL_ZEPHYR_NOSTRIP_DAEMON4      "daemon."
208
209#define OWL_REGEX_QUOTECHARS    "!+*.?[]^\\${}()"
210#define OWL_REGEX_QUOTEWITH     "\\"
211
212#if defined(HAVE_DES_STRING_TO_KEY) && defined(HAVE_DES_KEY_SCHED) && defined(HAVE_DES_ECB_ENCRYPT)
213#define OWL_ENABLE_ZCRYPT 1
214#endif
215
216#define OWL_META(key) ((key)|010000)
217/* OWL_CTRL is definied in kepress.c */
218
219#define LINE 2048
220
221#ifdef HAVE_LIBZEPHYR
222/* libzephyr doesn't use const, so we appease the type system with this kludge.
223 * This just casts const char * to char * in a way that doesn't yield a warning
224 * from gcc -Wcast-qual. */
225static inline char *zstr(const char *str)
226{
227  union { char *rw; const char *ro; } u;
228  u.ro = str;
229  return u.rw;
230}
231#endif
232
233/* Convert char *const * into const char *const *.  This conversion is safe,
234 * and implicit in C++ (conv.qual 4) but for some reason not in C. */
235static inline const char *const *strs(char *const *pstr)
236{
237  return (const char *const *)pstr;
238}
239
240typedef struct _owl_variable {
241  char *name;
242  int   type;  /* OWL_VARIABLE_* */
243  void *pval_default;  /* for types other and string */
244  int   ival_default;  /* for types int and bool     */
245  char *validsettings;          /* documentation of valid settings */
246  char *summary;                /* summary of usage */
247  char *description;            /* detailed description */
248  void *val;                    /* current value */
249  int  (*validate_fn)(const struct _owl_variable *v, const void *newval);
250                                /* returns 1 if newval is valid */
251  int  (*set_fn)(struct _owl_variable *v, const void *newval); 
252                                /* sets the variable to a value
253                                 * of the appropriate type.
254                                 * unless documented, this
255                                 * should make a copy.
256                                 * returns 0 on success. */
257  int  (*set_fromstring_fn)(struct _owl_variable *v, const char *newval);
258                                /* sets the variable to a value
259                                 * of the appropriate type.
260                                 * unless documented, this
261                                 * should make a copy.
262                                 * returns 0 on success. */
263  const void *(*get_fn)(const struct _owl_variable *v);
264                                /* returns a reference to the current value.
265                                 * WARNING:  this approach is hard to make
266                                 * thread-safe... */
267  int  (*get_tostring_fn)(const struct _owl_variable *v, 
268                          char *buf, int bufsize, const void *val); 
269                                /* converts val to a string
270                                 * and puts into buf */
271  void (*delete_fn)(struct _owl_variable *v);
272                                /* frees val as needed */
273} owl_variable;
274
275typedef struct _owl_input {
276  int ch;
277  gunichar uch;
278} owl_input;
279
280typedef struct _owl_fmtext {
281  GString *buff;
282  char default_attrs;
283  short default_fgcolor;
284  short default_bgcolor;
285} owl_fmtext;
286
287typedef struct _owl_list {
288  int size;
289  int avail;
290  void **list;
291} owl_list;
292
293typedef struct _owl_dict_el {
294  char *k;                      /* key   */
295  void *v;                      /* value */
296} owl_dict_el;
297
298typedef struct _owl_dict {
299  int size;
300  int avail;
301  owl_dict_el *els;             /* invariant: sorted by k */
302} owl_dict;
303typedef owl_dict owl_vardict;   /* dict of variables */
304typedef owl_dict owl_cmddict;   /* dict of commands */
305
306typedef struct _owl_context {
307  int   mode;
308  void *data;           /* determined by mode */
309  char *keymap;
310  owl_window *cursor;
311  void (*deactivate_cb)(struct _owl_context*);
312  void (*delete_cb)(struct _owl_context*);
313  void *cbdata;
314} owl_context;
315
316typedef struct _owl_cmd {       /* command */
317  char *name;
318
319  char *summary;                /* one line summary of command */
320  char *usage;                  /* usage synopsis */
321  char *description;            /* long description of command */
322
323  int validctx;                 /* bitmask of valid contexts */
324
325  /* we should probably have a type here that says which of
326   * the following is valid, and maybe make the below into a union... */
327
328  /* Only one of these may be non-NULL ... */
329
330  char *cmd_aliased_to;         /* what this command is aliased to... */
331 
332  /* These don't take any context */
333  char *(*cmd_args_fn)(int argc, const char *const *argv, const char *buff); 
334                                /* takes argv and the full command as buff.
335                                 * caller must free return value if !NULL */
336  void (*cmd_v_fn)(void);       /* takes no args */
337  void (*cmd_i_fn)(int i);      /* takes an int as an arg */
338
339  /* The following also take the active context if it's valid */
340  char *(*cmd_ctxargs_fn)(void *ctx, int argc, const char *const *argv, const char *buff); 
341                                /* takes argv and the full command as buff.
342                                 * caller must free return value if !NULL */
343  void (*cmd_ctxv_fn)(void *ctx);               /* takes no args */
344  void (*cmd_ctxi_fn)(void *ctx, int i);        /* takes an int as an arg */
345  SV *cmd_perl;                                /* Perl closure that takes a list of args */
346} owl_cmd;
347
348
349typedef struct _owl_zwrite {
350  char *cmd;
351  char *zwriteline;
352  char *class;
353  char *inst;
354  char *realm;
355  char *opcode;
356  char *zsig;
357  char *message;
358  owl_list recips;
359  int cc;
360  int noping;
361} owl_zwrite;
362
363typedef struct _owl_pair {
364  const char *key;
365  char *value;
366} owl_pair;
367
368struct _owl_fmtext_cache;
369
370typedef struct _owl_message {
371  int id;
372  int direction;
373#ifdef HAVE_LIBZEPHYR
374  ZNotice_t notice;
375#endif
376  struct _owl_fmtext_cache * fmtext;
377  int delete;
378  const char *hostname;
379  owl_list attributes;            /* this is a list of pairs */
380  char *timestr;
381  time_t time;
382} owl_message;
383
384#define OWL_FMTEXT_CACHE_SIZE 1000
385/* We cache the saved fmtexts for the last bunch of messages we
386   rendered */
387typedef struct _owl_fmtext_cache {
388    owl_message * message;
389    owl_fmtext fmtext;
390} owl_fmtext_cache;
391
392typedef struct _owl_style {
393  char *name;
394  SV *perlobj;
395} owl_style;
396
397typedef struct _owl_mainwin {
398  int curtruncated;
399  int lasttruncated;
400  int lastdisplayed;
401  owl_window *window;
402} owl_mainwin;
403
404typedef struct _owl_editwin owl_editwin;
405typedef struct _owl_editwin_excursion owl_editwin_excursion;
406
407typedef struct _owl_viewwin {
408  owl_fmtext fmtext;
409  int textlines;
410  int topline;
411  int rightshift;
412  owl_window *window;
413  void (*onclose_hook) (struct _owl_viewwin *vwin, void *data);
414  void *onclose_hook_data;
415
416  gulong sig_resize_id;
417  owl_window *content;
418  gulong sig_content_redraw_id;
419  owl_window *status;
420  gulong sig_status_redraw_id;
421  owl_window *cmdwin;
422} owl_viewwin;
423 
424typedef struct _owl_popwin {
425  owl_window *border;
426  owl_window *content;
427  gulong sig_redraw_id;
428  gulong sig_resize_id;
429} owl_popwin;
430 
431typedef struct _owl_msgwin {
432  char *msg;
433  owl_window *window;
434  gulong redraw_id;
435} owl_msgwin;
436
437typedef struct _owl_messagelist {
438  owl_list list;
439} owl_messagelist;
440
441typedef struct _owl_regex {
442  int negate;
443  char *string;
444  regex_t re;
445} owl_regex;
446
447typedef struct _owl_filterelement {
448  int (*match_message)(const struct _owl_filterelement *fe, const owl_message *m);
449  /* Append a string representation of the filterelement onto buf*/
450  void (*print_elt)(const struct _owl_filterelement *fe, GString *buf);
451  /* Operands for and,or,not*/
452  struct _owl_filterelement *left, *right;
453  /* For regex filters*/
454  owl_regex re;
455  /* Used by regexes, filter references, and perl */
456  char *field;
457} owl_filterelement;
458
459typedef struct _owl_filter {
460  char *name;
461  owl_filterelement * root;
462  int fgcolor;
463  int bgcolor;
464} owl_filter;
465
466typedef struct _owl_view {
467  char *name;
468  owl_filter *filter;
469  owl_messagelist ml;
470  const owl_style *style;
471  int cachedmsgid;
472} owl_view;
473
474typedef struct _owl_history {
475  owl_list hist;
476  int cur;
477  int touched;
478  int partial;
479  int repeats;
480} owl_history;
481
482typedef struct _owl_mainpanel {
483  owl_window *panel;
484  owl_window *typwin;
485  owl_window *sepwin;
486  owl_window *msgwin;
487  owl_window *recwin;
488  int recwinlines;
489} owl_mainpanel;
490
491typedef struct _owl_keybinding {
492  int  *keys;                   /* keypress stack */
493  int   len;                    /* length of stack */
494  int   type;                   /* command or function? */
495  char *desc;                   /* description (or "*user*") */
496  char *command;                /* command, if of type command */
497  void (*function_fn)(void);    /* function ptr, if of type function */
498} owl_keybinding;
499
500typedef struct _owl_keymap {
501  char     *name;               /* name of keymap */
502  char     *desc;               /* description */
503  owl_list  bindings;           /* key bindings */
504  const struct _owl_keymap *parent;     /* parent */
505  void (*default_fn)(owl_input j);      /* default action (takes a keypress) */
506  void (*prealways_fn)(owl_input  j);   /* always called before a keypress is received */
507  void (*postalways_fn)(owl_input  j);  /* always called after keypress is processed */
508} owl_keymap;
509
510typedef struct _owl_keyhandler {
511  owl_dict  keymaps;            /* dictionary of keymaps */
512  const owl_keymap *active;             /* currently active keymap */
513  int       in_esc;             /* escape pressed? */
514  int       kpstack[OWL_KEYMAP_MAXSTACK+1]; /* current stack of keypresses */
515  int       kpstackpos;         /* location in stack (-1 = none) */
516} owl_keyhandler;
517
518typedef struct _owl_buddy {
519  int proto;
520  char *name;
521  int isidle;
522  int idlesince;
523} owl_buddy;
524
525typedef struct _owl_buddylist {
526  owl_list buddies;
527} owl_buddylist;
528
529typedef struct _owl_zbuddylist {
530  owl_list zusers;
531} owl_zbuddylist;
532
533typedef struct _owl_timer {
534  time_t time;
535  int interval;
536  void (*callback)(struct _owl_timer *, void *);
537  void (*destroy)(struct _owl_timer *);
538  void *data;
539  char *name;
540} owl_timer;
541
542typedef struct _owl_errqueue {
543  owl_list errlist;
544} owl_errqueue;
545
546typedef struct _owl_colorpair_mgr {
547  int next;
548  short **pairs;
549  bool overflow;
550} owl_colorpair_mgr;
551
552typedef struct _owl_io_dispatch {
553  int fd;                                     /* FD to watch for dispatch. */
554  int mode;
555  int needs_gc;
556  void (*callback)(const struct _owl_io_dispatch *, void *); /* C function to dispatch to. */
557  void (*destroy)(const struct _owl_io_dispatch *);  /* Destructor */
558  void *data;
559} owl_io_dispatch;
560
561typedef struct _owl_ps_action {
562  int needs_gc;
563  int (*callback)(struct _owl_ps_action *, void *);
564  void (*destroy)(struct _owl_ps_action *);
565  void *data;
566} owl_ps_action;
567
568typedef struct _owl_popexec {
569  int refcount;
570  owl_viewwin *vwin;
571  int winactive;
572  pid_t pid;                    /* or 0 if it has terminated */
573  const owl_io_dispatch *dispatch;
574} owl_popexec;
575
576typedef struct _OwlGlobalNotifier OwlGlobalNotifier;
577
578typedef struct _owl_global {
579  owl_mainwin mw;
580  owl_popwin *pw;
581  owl_msgwin msgwin;
582  owl_history cmdhist;          /* command history */
583  owl_history msghist;          /* outgoing message history */
584  owl_keyhandler kh;
585  owl_dict filters;
586  GList *filterlist;
587  owl_list puntlist;
588  owl_vardict vars;
589  owl_cmddict cmds;
590  GList *context_stack;
591  owl_errqueue errqueue;
592  int lines, cols;
593  int curmsg, topmsg;
594  int markedmsgid;              /* for finding the marked message when it has moved. */
595  int curmsg_vert_offset;
596  owl_view current_view;
597  owl_messagelist msglist;
598  WINDOW *input_pad;
599  owl_mainpanel mainpanel;
600  gulong typwin_erase_id;
601  int rightshift;
602  volatile sig_atomic_t resizepending;
603  char *thishost;
604  char *homedir;
605  char *confdir;
606  char *startupfile;
607  int direction;
608  int zaway;
609  char *cur_zaway_msg;
610  int haveconfig;
611  int config_format;
612  void *buffercbdata;
613  owl_editwin *tw;
614  owl_viewwin *vw;
615  void *perl;
616  int debug;
617  time_t starttime;
618  time_t lastinputtime;
619  char *startupargs;
620  int nextmsgid;
621  int hascolors;
622  int colorpairs;
623  owl_colorpair_mgr cpmgr;
624  pid_t newmsgproc_pid;
625  owl_regex search_re;
626  aim_session_t aimsess;
627  aim_conn_t bosconn;
628  int aim_loggedin;         /* true if currently logged into AIM */
629  int aim_doprocessing;     /* true if we should process AIM events (like pending login) */
630  char *aim_screenname;     /* currently logged in AIM screen name */
631  char *aim_screenname_for_filters;     /* currently logged in AIM screen name */
632  owl_buddylist buddylist;  /* list of logged in AIM buddies */
633  GQueue *messagequeue;     /* for queueing up aim and other messages */
634  owl_dict styledict;       /* global dictionary of available styles */
635  char *response;           /* response to the last question asked */
636  int havezephyr;
637  int haveaim;
638  int ignoreaimlogin;
639  volatile sig_atomic_t got_err_signal; /* 1 if we got an unexpected signal */
640  volatile siginfo_t err_signal_info;
641  owl_zbuddylist zbuddies;
642  GList *zaldlist;
643  int pseudologin_notify;
644  struct termios startup_tio;
645  owl_list io_dispatch_list;
646  owl_list psa_list;
647  GList *timerlist;
648  owl_timer *aim_nop_timer;
649  int load_initial_subs;
650  volatile sig_atomic_t interrupted;
651  FILE *debug_file;
652  char *kill_buffer;
653} owl_global;
654
655/* globals */
656extern owl_global g;
657
658#include "owl_prototypes.h"
659
660/* These were missing from the Zephyr includes before Zephyr 3. */
661#if defined HAVE_LIBZEPHYR && defined ZCONST
662int ZGetSubscriptions(ZSubscription_t *, int *);
663int ZGetLocations(ZLocations_t *,int *);
664#endif
665
666#endif /* INC_BARNOWL_OWL_H */
Note: See TracBrowser for help on using the repository browser.