Changes in / [26ad412:e488ec5]
- Files:
-
- 26 added
- 1 deleted
- 36 edited
Legend:
- Unmodified
- Added
- Removed
-
.gitignore
rde18326 rf93cc34 15 15 autom4te.cache 16 16 barnowl.bin 17 tester.bin 17 18 zcrypt 18 19 blib … … 30 31 owl_prototypes.h 31 32 owl_prototypes.h.new 32 perl_tester33 33 perlglue.c 34 34 perlwrap.c -
Makefile.am
r5aa33fd r9d27ee8 1 1 ACLOCAL_AMFLAGS = -I m4 2 CFLAGS += $(EXTRA_CFLAGS) 2 3 3 4 GIT_DESCRIPTION := $(if $(wildcard .git),$(shell git describe --match='barnowl-*' HEAD 2>/dev/null)) … … 18 19 $(GEN_C) $(GEN_H) 19 20 21 man_MANS = doc/barnowl.1 22 doc_DATA = doc/intro.txt doc/advanced.txt 23 20 24 barnowl_bin_LDADD = libfaim/libfaim.a 21 25 … … 35 39 $(GIT_FLAGS) 36 40 37 BASE_SRCS=list.c message.c mainwin.c popwin.c zephyr.c messagelist.c \41 CODELIST_SRCS=list.c message.c mainwin.c popwin.c zephyr.c messagelist.c \ 38 42 commands.c global.c text.c fmtext.c editwin.c util.c logging.c \ 39 43 perlconfig.c keys.c functions.c zwrite.c viewwin.c help.c filter.c \ … … 41 45 keypress.c keymap.c keybinding.c cmd.c context.c \ 42 46 aim.c buddy.c buddylist.c style.c errqueue.c \ 43 zbuddylist.c popexec.c obarray.c select.c wcwidth.c \ 44 glib_compat.c filterproc.c 47 zbuddylist.c popexec.c select.c wcwidth.c \ 48 glib_compat.c mainpanel.c msgwin.c sepbar.c 49 50 NORMAL_SRCS = filterproc.c window.c windowcb.c 51 52 BASE_SRCS = $(CODELIST_SRCS) $(NORMAL_SRCS) 45 53 46 54 GEN_C = varstubs.c perlglue.c … … 64 72 $(AM_V_GEN)perl $< $(sort $(filter-out $<,$+)) > $@ 65 73 66 owl_prototypes.h.new: codelist.pl varstubs.c $( BASE_SRCS)74 owl_prototypes.h.new: codelist.pl varstubs.c $(CODELIST_SRCS) 67 75 $(AM_V_GEN)perl $< $(sort $(filter-out $<,$+)) > $@ 68 76 -
README
r62c91c1 raeadc74 1 1 BarnOwl - owl, with more ponies 2 2 3 Source is freely available from http://github.com/barnowl/barnowl/ 4 3 5 Based on owl 2.1.11, by James Kretchmar (http://www.ktools.org) 4 5 This project is a work in progress.6 We guarantee no stability of form or function.7 6 8 7 Notes: -
cmd.c
r8d4b521 r1cc9b615 52 52 cmd = owl_malloc(sizeof(owl_cmd)); 53 53 owl_cmd_create_alias(cmd, alias_from, alias_to); 54 owl_perlconfig_new_command(cmd->name); 54 55 owl_dict_insert_element(cd, cmd->name, cmd, (void (*)(void *))owl_cmd_delete); 55 56 return(0); … … 73 74 } else if (NULL != (cmd = owl_dict_find_element(cd, argv[0]))) { 74 75 retval = owl_cmd_execute(cmd, cd, ctx, argc, argv, buff); 76 /* redraw the sepbar; TODO: don't violate layering */ 77 owl_global_sepbar_dirty(&g); 75 78 } else { 76 79 owl_function_makemsg("Unknown command '%s'.", buff); … … 89 92 if (argc < 0) { 90 93 owl_free(tmpbuff); 91 sepbar(NULL);92 94 owl_function_makemsg("Unbalanced quotes"); 93 95 return NULL; … … 104 106 owl_parse_delete(argv, argc); 105 107 owl_free(tmpbuff); 106 sepbar(NULL);107 108 return retval; 108 109 } -
commands.c
r7ba9e0de r987cf3f 106 106 OWLCMD_ARGS("zwrite", owl_command_zwrite, OWL_CTX_INTERACTIVE, 107 107 "send a zephyr", 108 "zwrite [-n] [-C] [-c class] [-i instance] [-r realm] [-O opc de] [<user> ...] [-m <message...>]",108 "zwrite [-n] [-C] [-c class] [-i instance] [-r realm] [-O opcode] [<user> ...] [-m <message...>]", 109 109 "Zwrite send a zephyr to the one or more users specified.\n\n" 110 110 "The following options are available:\n\n" … … 136 136 "Send a local message.\n"), 137 137 138 OWLCMD_ARGS("zcrypt", owl_command_z crypt, OWL_CTX_INTERACTIVE,138 OWLCMD_ARGS("zcrypt", owl_command_zwrite, OWL_CTX_INTERACTIVE, 139 139 "send an encrypted zephyr", 140 "zcrypt [-n] [-C] [-c class] [-i instance] [-r realm] [-O opc de] [-m <message...>]\n",140 "zcrypt [-n] [-C] [-c class] [-i instance] [-r realm] [-O opcode] [-m <message...>]\n", 141 141 "Behaves like zwrite but uses encryption. Not for use with\n" 142 142 "personal messages\n"), … … 148 148 "allow editing.\n\n" 149 149 "If 'sender' is specified, reply to the sender.\n\n" 150 "If 'all' or no args are specified, reply public ally to the\n"150 "If 'all' or no args are specified, reply publicly to the\n" 151 151 "same class/instance for non-personal messages and to the\n" 152 152 "sender for personal messages.\n\n" … … 266 266 "zpunt <class> <instance> [recipient]\n" 267 267 "zpunt <instance>", 268 "The zpunt command will sup ress messageto the specified\n"268 "The zpunt command will suppress messages to the specified\n" 269 269 "zephyr triplet. In the second usage messages are suppressed\n" 270 270 "for class MESSAGE and the named instance.\n\n" … … 283 283 "punt <filter-text>", 284 284 "punt <filter-text (multiple words)>\n" 285 "The punt command will sup ress messageto the specified\n"285 "The punt command will suppress messages to the specified\n" 286 286 "filter\n\n" 287 287 "SEE ALSO: unpunt, zpunt, show zpunts\n"), … … 586 586 "name style after the -s argument.\n" 587 587 "\n" 588 "The other usages listed above are abbre ivated forms that simply set\n"588 "The other usages listed above are abbreviated forms that simply set\n" 589 589 "the filter of the current view. The -d option allows you to write a\n" 590 590 "filter expression that will be dynamically created by owl and then\n" … … 594 594 OWLCMD_ARGS("smartnarrow", owl_command_smartnarrow, OWL_CTX_INTERACTIVE, 595 595 "view only messages similar to the current message", 596 "smartnarrow [-i | --instance] [-r | --relat de]",596 "smartnarrow [-i | --instance] [-r | --related]", 597 597 "If the curmsg is a personal message narrow\n" 598 598 " to the conversation with that user.\n" … … 614 614 " message, the filter is to that instance.\n" 615 615 "If the curmsg is a class message, the filter is that class.\n" 616 "If the curmsg is a class message and '-i' is speci ed\n"616 "If the curmsg is a class message and '-i' is specified\n" 617 617 " the filter is to that class and instance.\n"), 618 618 … … 674 674 "for formatting messages.\n\n" 675 675 "Show variables will list the names of all variables.\n\n" 676 "Show errors will show a list of errors e countered by Owl.\n\n"676 "Show errors will show a list of errors encountered by Owl.\n\n" 677 677 "SEE ALSO: filter, view, alias, bindkey, help\n"), 678 678 … … 743 743 "set the search highlight string without searching", 744 744 "setsearch <string>", 745 "The setsearch command highlights all occur ences of its\n"745 "The setsearch command highlights all occurrences of its\n" 746 746 "argument and makes it the default argument for future\n" 747 747 "search commands, but does not move the cursor. With\n" … … 1371 1371 { 1372 1372 owl_function_full_redisplay(); 1373 owl_global_set_needrefresh(&g);1374 1373 } 1375 1374 … … 1387 1386 { 1388 1387 owl_global_set_rightshift(&g, shift); 1389 owl_mainwin_redisplay(owl_global_get_mainwin(&g));1390 owl_global_set_needrefresh(&g);1391 1388 } 1392 1389 … … 1914 1911 char *owl_command_zwrite(int argc, const char *const *argv, const char *buff) 1915 1912 { 1916 owl_zwrite z;1913 owl_zwrite *z; 1917 1914 1918 1915 if (!owl_global_is_havezephyr(&g)) { … … 1921 1918 } 1922 1919 /* check for a zwrite -m */ 1923 owl_zwrite_create_from_line(&z, buff); 1924 if (owl_zwrite_is_message_set(&z)) { 1925 owl_function_zwrite(buff, NULL); 1926 owl_zwrite_cleanup(&z); 1927 return (NULL); 1928 } 1929 owl_zwrite_cleanup(&z); 1920 z = owl_zwrite_new(buff); 1921 if (!z) { 1922 owl_function_error("Error in zwrite arguments"); 1923 return NULL; 1924 } 1925 1926 if (owl_zwrite_is_message_set(z)) { 1927 owl_function_zwrite(z, NULL); 1928 owl_zwrite_delete(z); 1929 return NULL; 1930 } 1930 1931 1931 1932 if (argc < 2) { 1933 owl_zwrite_delete(z); 1932 1934 owl_function_makemsg("Not enough arguments to the zwrite command."); 1933 1935 } else { 1934 owl_function_zwrite_setup( buff);1936 owl_function_zwrite_setup(z); 1935 1937 } 1936 1938 return(NULL); … … 2022 2024 } 2023 2025 2024 char *owl_command_zcrypt(int argc, const char *const *argv, const char *buff)2025 {2026 owl_zwrite z;2027 2028 if (!owl_global_is_havezephyr(&g)) {2029 owl_function_makemsg("Zephyr is not available");2030 return(NULL);2031 }2032 /* check for a zcrypt -m */2033 owl_zwrite_create_from_line(&z, buff);2034 if (owl_zwrite_is_message_set(&z)) {2035 owl_function_zcrypt(buff, NULL);2036 owl_zwrite_cleanup(&z);2037 return (NULL);2038 }2039 owl_zwrite_cleanup(&z);2040 2041 if (argc < 2) {2042 owl_function_makemsg("Not enough arguments to the zcrypt command.");2043 } else {2044 owl_function_zwrite_setup(buff);2045 }2046 return(NULL);2047 }2048 2049 2026 char *owl_command_reply(int argc, const char *const *argv, const char *buff) 2050 2027 { … … 2184 2161 argc--; 2185 2162 argv++; 2186 } else if (!strcmp(argv[0], "-r")) {2187 const char *foo;2188 foo=owl_function_create_negative_filter(owl_view_get_filtname(owl_global_get_current_view(&g)));2189 owl_function_change_currentview_filter(foo);2190 2163 } else if (!strcmp(argv[0], "-s")) { 2191 2164 if (argc<2) { … … 2717 2690 } 2718 2691 2719 owl_global_set_needrefresh(&g);2720 2692 owl_global_pop_context(&g); 2721 2693 … … 2738 2710 owl_editwin_clear(e); 2739 2711 owl_editwin_insert_string(e, ptr); 2740 owl_editwin_redisplay(e);2741 owl_global_set_needrefresh(&g);2742 2712 } else { 2743 2713 owl_function_beep(); … … 2755 2725 owl_editwin_clear(e); 2756 2726 owl_editwin_insert_string(e, ptr); 2757 owl_editwin_redisplay(e);2758 owl_global_set_needrefresh(&g);2759 2727 } else { 2760 2728 owl_function_beep(); … … 2766 2734 buff = skiptokens(buff, 1); 2767 2735 owl_editwin_insert_string(e, buff); 2768 owl_editwin_redisplay(e);2769 owl_global_set_needrefresh(&g);2770 2736 return NULL; 2771 2737 } … … 2782 2748 owl_global_set_typwin_inactive(&g); 2783 2749 owl_global_pop_context(&g); 2784 owl_global_set_needrefresh(&g);2785 2750 2786 2751 owl_editwin_do_callback(e); … … 2804 2769 void owl_command_popless_quit(owl_viewwin *vw) 2805 2770 { 2771 owl_viewwin_cleanup(vw); 2806 2772 owl_popwin_close(owl_global_get_popwin(&g)); 2807 2773 owl_global_pop_context(&g); 2808 owl_viewwin_cleanup(vw); 2809 owl_global_set_needrefresh(&g); 2810 } 2774 } -
configure.ac
r263320f r04af908 35 35 [with_zephyr=check]) 36 36 37 AC_ARG_WITH([krb4], 38 AS_HELP_STRING([--with-krb4], 39 [Build with kerberos IV])) 40 37 41 AS_IF([test "x$with_zephyr" != xno], 38 [AC_MSG_CHECKING([for Kerberos IV]) 39 AS_IF([krb5-config krb4 --libs >/dev/null 2>&1], 40 [AC_MSG_RESULT([yes]) 41 AC_DEFINE([HAVE_KERBEROS_IV], [1], [Define if you have kerberos IV]) 42 CFLAGS="${CFLAGS} `krb5-config krb4 --cflags`" 43 LIBS="${LIBS} `krb5-config krb4 --libs`" 44 ], 45 [AC_MSG_RESULT([no]) 46 PKG_CHECK_MODULES([LIBCRYPTO], [libcrypto]) 47 CFLAGS="${CFLAGS} ${LIBCRYPTO_CFLAGS}" 48 LIBS="${LIBS} ${LIBCRYPTO_LIBS}" 49 ]) 42 [AS_IF([test "x$with_krb4" != "xno"], 43 [AC_MSG_CHECKING([for Kerberos IV]) 44 AS_IF([krb5-config krb4 --libs >/dev/null 2>&1], 45 [AC_MSG_RESULT([yes]) 46 AC_DEFINE([HAVE_KERBEROS_IV], [1], [Define if you have kerberos IV]) 47 CFLAGS="${CFLAGS} `krb5-config krb4 --cflags`" 48 LIBS="${LIBS} `krb5-config krb4 --libs`" 49 ], 50 [AC_MSG_RESULT([no]) 51 AS_IF([test "x$with_krb4" = "xyes"], 52 [AC_MSG_ERROR([Kerberos IV requested but not found])]) 53 PKG_CHECK_MODULES([LIBCRYPTO], [libcrypto]) 54 CFLAGS="${CFLAGS} ${LIBCRYPTO_CFLAGS}" 55 LIBS="${LIBS} ${LIBCRYPTO_LIBS}" 56 ])]) 50 57 AC_CHECK_LIB([zephyr], [ZGetSender], 51 58 [LIBS="$LIBS -lzephyr" … … 108 115 109 116 dnl Add CFLAGS and LDFLAGS for glib-2.0 110 PKG_CHECK_MODULES(GLIB, glib-2.0)117 PKG_CHECK_MODULES(GLIB,[glib-2.0 gobject-2.0]) 111 118 112 119 AC_MSG_NOTICE([Adding glib-2.0 CFLAGS ${GLIB_CFLAGS}]) … … 131 138 test "$HAVE_DES_ECB_ENCRYPT"]) 132 139 140 CFLAGS="$CFLAGS -D_XOPEN_SOURCE" 141 133 142 AC_SUBST([LIBFAIM_CFLAGS]) 134 143 -
context.c
r2a17b63 r07b59ea 9 9 ctx->mode = OWL_CTX_STARTUP; 10 10 ctx->data = NULL; 11 ctx->cursor = NULL; 11 12 return 0; 12 13 } -
doc/code.txt
r1286893 r44cc9ab 86 86 Meta. At any one time, there is exactly one active 87 87 keymap which determines where keybindings are looked for 88 (along with its submaps).88 (along with its parents). 89 89 90 90 list: Simple list abstraction. (Uses realloc to resize the list.) -
editwin.c
r9d7a720 r3f11c00 28 28 int cursorx; 29 29 int winlines, wincols, fillcol, wrapcol; 30 WINDOW *curswin; 30 owl_window *win; 31 gulong repaint_id; 32 gulong resized_id; 31 33 int style; 32 34 int lock; … … 40 42 }; 41 43 44 static void oe_set_window(owl_editwin *e, owl_window *w, int winlines, int wincols); 45 static void oe_redraw(owl_window *win, WINDOW *curswin, void *user_data); 42 46 static void oe_reframe(owl_editwin *e); 43 47 static void oe_save_excursion(owl_editwin *e, oe_excursion *x); … … 58 62 static char *oe_chunk(owl_editwin *e, int start, int end); 59 63 static void oe_destroy_cbdata(owl_editwin *e); 64 static void oe_dirty(owl_editwin *e); 65 static void oe_window_resized(owl_window *w, owl_editwin *e); 60 66 61 67 #define INCR 4096 … … 73 79 void owl_editwin_delete(owl_editwin *e) 74 80 { 81 if (e->win) { 82 g_signal_handler_disconnect(e->win, e->repaint_id); 83 g_signal_handler_disconnect(e->win, e->resized_id); 84 } 75 85 owl_free(e->buff); 76 86 owl_free(e->killbuf); … … 91 101 } 92 102 e->index = index; 103 oe_dirty(e); 93 104 } 94 105 … … 105 116 106 117 static void _owl_editwin_init(owl_editwin *e, 107 WINDOW *win,108 118 int winlines, 109 119 int wincols, … … 130 140 e->style=OWL_EDITWIN_STYLE_MULTILINE; 131 141 } 132 owl_editwin_set_curswin(e, win, winlines, wincols);133 142 e->lock=0; 134 143 e->dotsend=0; 135 144 e->echochar='\0'; 136 137 if (win) werase(win); 138 } 139 140 owl_editwin *owl_editwin_new(WINDOW *win, int winlines, int wincols, int style, owl_history *hist) 145 } 146 147 owl_editwin *owl_editwin_new(owl_window *win, int winlines, int wincols, int style, owl_history *hist) 141 148 { 142 149 owl_editwin *e = owl_editwin_allocate(); 143 150 144 _owl_editwin_init(e, win, winlines, wincols, style, hist); 151 _owl_editwin_init(e, winlines, wincols, style, hist); 152 oe_set_window(e, win, winlines, wincols); 145 153 return e; 146 154 } 147 155 148 void owl_editwin_set_curswin(owl_editwin *e, WINDOW *w, int winlines, int wincols) 149 { 150 e->curswin=w; 156 static void oe_window_resized(owl_window *w, owl_editwin *e) 157 { 158 /* update the sizes */ 159 owl_window_get_position(w, &e->winlines, &e->wincols, NULL, NULL); 160 } 161 162 static void oe_set_window(owl_editwin *e, owl_window *w, int winlines, int wincols) 163 { 164 e->win=w; 151 165 e->winlines=winlines; 152 166 e->wincols=wincols; … … 156 170 else 157 171 e->wrapcol = 0; 172 if (e->win) { 173 e->repaint_id = g_signal_connect(w, "redraw", G_CALLBACK(oe_redraw), e); 174 e->resized_id = g_signal_connect(w, "resized", G_CALLBACK(oe_window_resized), e); 175 owl_window_dirty(e->win); 176 } 158 177 } 159 178 … … 165 184 { 166 185 e->echochar=ch; 167 } 168 169 WINDOW *owl_editwin_get_curswin(owl_editwin *e) 170 { 171 return(e->curswin); 186 oe_dirty(e); 172 187 } 173 188 … … 239 254 e->lock=e->bufflen; 240 255 oe_set_index(e, e->lock); 241 o wl_editwin_redisplay(e);256 oe_dirty(e); 242 257 } 243 258 … … 265 280 266 281 owl_free(e->buff); 267 _owl_editwin_init(e, e-> curswin, e->winlines, e->wincols, e->style, e->hist);282 _owl_editwin_init(e, e->winlines, e->wincols, e->style, e->hist); 268 283 269 284 if (lock > 0) { … … 286 301 { 287 302 e->topindex = -1; 303 oe_dirty(e); 288 304 } 289 305 … … 467 483 468 484 oe_restore_excursion(e, &x); 469 } 470 471 static void oe_addnec(owl_editwin *e, int count) 485 oe_dirty(e); 486 } 487 488 static void oe_addnec(owl_editwin *e, WINDOW *curswin, int count) 472 489 { 473 490 int i; 474 491 475 492 for (i = 0; i < count; i++) 476 waddch( e->curswin, e->echochar);477 } 478 479 static void oe_mvaddnec(owl_editwin *e, int y, int x, int count)480 { 481 wmove( e->curswin, y, x);482 oe_addnec(e, c ount);493 waddch(curswin, e->echochar); 494 } 495 496 static void oe_mvaddnec(owl_editwin *e, WINDOW *curswin, int y, int x, int count) 497 { 498 wmove(curswin, y, x); 499 oe_addnec(e, curswin, count); 483 500 } 484 501 485 502 /* regenerate the text on the curses window */ 486 void owl_editwin_redisplay(owl_editwin *e)503 static void oe_redraw(owl_window *win, WINDOW *curswin, void *user_data) 487 504 { 488 505 int x = -1, y = -1, t, hard; 489 506 int line, index, lineindex, times = 0; 507 owl_editwin *e = user_data; 490 508 491 509 do { 492 werase( e->curswin);510 werase(curswin); 493 511 494 512 if (e->topindex == -1 || e->index < e->topindex) … … 505 523 if (index - lineindex) { 506 524 if (!e->echochar) 507 mvwaddnstr( e->curswin, line, 0,525 mvwaddnstr(curswin, line, 0, 508 526 e->buff + lineindex, 509 527 index - lineindex); 510 528 else { 511 529 if(lineindex < e->lock) { 512 mvwaddnstr( e->curswin, line, 0,530 mvwaddnstr(curswin, line, 0, 513 531 e->buff + lineindex, 514 532 MIN(index - lineindex, 515 533 e->lock - lineindex)); 516 534 if (e->lock < index) 517 oe_addnec(e, 535 oe_addnec(e, curswin, 518 536 oe_region_width(e, e->lock, index, 519 537 oe_region_width(e, lineindex, e->lock, 0))); 520 538 } else 521 oe_mvaddnec(e, line, 0, oe_region_width(e, lineindex, index, 0));539 oe_mvaddnec(e, curswin, line, 0, oe_region_width(e, lineindex, index, 0)); 522 540 } 523 541 if (!hard) 524 waddch( e->curswin, '\\');542 waddch(curswin, '\\'); 525 543 } 526 544 line++; … … 531 549 } while(x == -1 && times < 3); 532 550 533 wmove( e->curswin, y, x);551 wmove(curswin, y, x); 534 552 e->cursorx = x; 535 553 } … … 624 642 if (start <= e->topindex) 625 643 owl_editwin_recenter(e); 644 645 oe_dirty(e); 626 646 627 647 return change; … … 857 877 858 878 e->goal_column = goal_column; 879 oe_dirty(e); 859 880 860 881 return distance; … … 1211 1232 return; 1212 1233 } 1213 owl_editwin_redisplay(e);1214 1234 } 1215 1235 … … 1346 1366 } 1347 1367 1368 static void oe_dirty(owl_editwin *e) 1369 { 1370 if (e->win) owl_window_dirty(e->win); 1371 } 1372 1348 1373 1349 1374 -
functions.c
rd12a8c7 rd12a8c7 216 216 /* redisplay etc. */ 217 217 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 218 owl_global_set_needrefresh(&g);219 218 } 220 219 … … 223 222 * that. 224 223 */ 225 owl_message *owl_function_make_outgoing_zephyr(const char *body, const char *zwriteline, const char *zsig)224 owl_message *owl_function_make_outgoing_zephyr(const owl_zwrite *z) 226 225 { 227 226 owl_message *m; 228 owl_zwrite zw;229 230 owl_zwrite_create_from_line(&zw, zwriteline);231 owl_zwrite_set_zsig(&zw, zsig);232 227 233 228 /* create the message */ 234 229 m=owl_malloc(sizeof(owl_message)); 235 236 owl_message_create_from_zwrite(m, &zw, body); 237 owl_zwrite_cleanup(&zw); 230 owl_message_create_from_zwrite(m, z, owl_zwrite_get_message(z)); 238 231 239 232 return(m); … … 293 286 owl_editwin_set_cbdata(e, data, cleanup); 294 287 owl_editwin_set_callback(e, callback); 295 owl_global_push_context(&g, OWL_CTX_EDITMULTI, e, "editmulti" );296 } 297 298 static void owl_function_write_setup(const char * line, const char *noun, void (*callback)(owl_editwin *))288 owl_global_push_context(&g, OWL_CTX_EDITMULTI, e, "editmulti", owl_global_get_typwin_window(&g)); 289 } 290 291 static void owl_function_write_setup(const char *noun) 299 292 { 300 293 … … 307 300 "End with a dot on a line by itself. ^C will quit.", 308 301 noun); 309 310 owl_function_start_edit_win(line, callback, 302 } 303 304 void owl_function_zwrite_setup(owl_zwrite *z) 305 { 306 /* send a ping if necessary */ 307 if (owl_global_is_txping(&g)) { 308 owl_zwrite_send_ping(z); 309 } 310 311 312 owl_function_write_setup("zephyr"); 313 owl_function_start_edit_win(z->zwriteline, 314 &owl_callback_zwrite, 315 z, (void(*)(void*))owl_zwrite_delete); 316 } 317 318 void owl_function_aimwrite_setup(const char *line) 319 { 320 owl_function_write_setup("message"); 321 owl_function_start_edit_win(line, 322 &owl_callback_aimwrite, 311 323 owl_strdup(line), 312 324 owl_free); 313 } 314 315 void owl_function_zwrite_setup(const char *line) 316 { 317 owl_zwrite z; 318 int ret; 319 320 /* check the arguments */ 321 ret=owl_zwrite_create_from_line(&z, line); 322 if (ret) { 323 owl_function_error("Error in zwrite arguments"); 324 owl_zwrite_cleanup(&z); 325 return; 326 } 327 328 /* send a ping if necessary */ 329 if (owl_global_is_txping(&g)) { 330 owl_zwrite_send_ping(&z); 331 } 332 owl_zwrite_cleanup(&z); 333 334 owl_function_write_setup(line, "zephyr", &owl_callback_zwrite); 335 } 336 337 void owl_function_aimwrite_setup(const char *line) 338 { 339 owl_function_write_setup(line, "message", &owl_callback_aimwrite); 325 340 326 } 341 327 342 328 void owl_function_loopwrite_setup(void) 343 329 { 344 owl_function_write_setup("loopwrite", "message", owl_callback_loopwrite); 330 owl_function_write_setup("message"); 331 owl_function_start_edit_win("loopwrite", 332 &owl_callback_loopwrite, 333 "loopwrite", NULL); 345 334 } 346 335 347 336 void owl_callback_zwrite(owl_editwin *e) { 348 char *command = owl_editwin_get_cbdata(e); 349 owl_function_zwrite(command, 350 owl_editwin_get_text(e)); 337 owl_zwrite *z = owl_editwin_get_cbdata(e); 338 owl_function_zwrite(z, owl_editwin_get_text(e)); 351 339 } 352 340 … … 354 342 * the message is expected to be set from the zwrite line itself 355 343 */ 356 void owl_function_zwrite(const char *line, const char *msg) 357 { 358 owl_zwrite z; 359 const char *mymsg; 344 void owl_function_zwrite(owl_zwrite *z, const char *msg) 345 { 360 346 owl_message *m; 361 347 362 if( !strncmp(line, "zcrypt", strlen("zcrypt"))) {363 owl_function_zcrypt( line, msg);348 if(strcmp(z->cmd, "zcrypt") == 0) { 349 owl_function_zcrypt(z, msg); 364 350 return; 365 351 } 366 352 367 353 /* create the zwrite and send the message */ 368 owl_zwrite_create_from_line(&z, line); 369 owl_zwrite_populate_zsig(&z); 354 owl_zwrite_populate_zsig(z); 370 355 if (msg) { 371 owl_zwrite_set_message( &z, msg);372 } 373 owl_zwrite_send_message( &z);356 owl_zwrite_set_message(z, msg); 357 } 358 owl_zwrite_send_message(z); 374 359 owl_function_makemsg("Waiting for ack..."); 375 360 376 361 /* If it's personal */ 377 if (owl_zwrite_is_personal( &z)) {362 if (owl_zwrite_is_personal(z)) { 378 363 /* create the outgoing message */ 379 mymsg=owl_zwrite_get_message(&z); 380 m=owl_function_make_outgoing_zephyr(mymsg, line, owl_zwrite_get_zsig(&z)); 364 m=owl_function_make_outgoing_zephyr(z); 381 365 382 366 if (m) { … … 386 370 } 387 371 } 388 389 /* free the zwrite */390 owl_zwrite_cleanup(&z);391 372 } 392 373 … … 394 375 * the message is expected to be set from the zwrite line itself 395 376 */ 396 void owl_function_zcrypt(const char *line, const char *msg) 397 { 398 owl_zwrite z; 399 const char *mymsg; 377 void owl_function_zcrypt(owl_zwrite *z, const char *msg) 378 { 400 379 char *cryptmsg; 401 380 owl_message *m; … … 403 382 char *zcrypt; 404 383 int rv, status; 384 char *old_msg; 405 385 406 386 /* create the zwrite and send the message */ 407 owl_zwrite_create_from_line(&z, line); 408 owl_zwrite_populate_zsig(&z); 387 owl_zwrite_populate_zsig(z); 409 388 if (msg) { 410 owl_zwrite_set_message(&z, msg); 411 } 412 413 mymsg=owl_zwrite_get_message(&z); 389 owl_zwrite_set_message(z, msg); 390 } 391 old_msg = owl_strdup(owl_zwrite_get_message(z)); 414 392 415 393 zcrypt = owl_sprintf("%s/zcrypt", owl_get_bindir()); 416 394 argv[0] = "zcrypt"; 417 395 argv[1] = "-E"; 418 argv[2] = "-c"; argv[3] = owl_zwrite_get_class( &z);419 argv[4] = "-i"; argv[5] = owl_zwrite_get_instance( &z);396 argv[2] = "-c"; argv[3] = owl_zwrite_get_class(z); 397 argv[4] = "-i"; argv[5] = owl_zwrite_get_instance(z); 420 398 argv[6] = NULL; 421 399 422 rv = call_filter(zcrypt, argv, mymsg, &cryptmsg, &status);400 rv = call_filter(zcrypt, argv, owl_zwrite_get_message(z), &cryptmsg, &status); 423 401 424 402 owl_free(zcrypt); … … 426 404 if (rv || status) { 427 405 if(cryptmsg) owl_free(cryptmsg); 406 owl_free(old_msg); 428 407 owl_function_error("Error in zcrypt, possibly no key found. Message not sent."); 429 408 owl_function_beep(); 430 owl_zwrite_cleanup(&z);431 409 return; 432 410 } 433 411 434 owl_zwrite_set_message (&z, cryptmsg);435 owl_zwrite_set_opcode( &z, "crypt");436 437 owl_zwrite_send_message( &z);412 owl_zwrite_set_message_raw(z, cryptmsg); 413 owl_zwrite_set_opcode(z, "crypt"); 414 415 owl_zwrite_send_message(z); 438 416 owl_function_makemsg("Waiting for ack..."); 439 417 440 418 /* If it's personal */ 441 if (owl_zwrite_is_personal( &z)) {442 /* create the outgoing message*/443 mymsg=owl_zwrite_get_message(&z);444 m=owl_function_make_outgoing_zephyr( mymsg, line, owl_zwrite_get_zsig(&z));419 if (owl_zwrite_is_personal(z)) { 420 /* Create the outgoing message. Restore the un-crypted message for display. */ 421 owl_zwrite_set_message_raw(z, old_msg); 422 m=owl_function_make_outgoing_zephyr(z); 445 423 if (m) { 446 424 owl_global_messagequeue_addmsg(&g, m); … … 452 430 /* free the zwrite */ 453 431 owl_free(cryptmsg); 454 owl_zwrite_cleanup(&z);455 432 } 456 433 … … 808 785 { 809 786 owl_global_set_rightshift(&g, owl_global_get_rightshift(&g)+10); 810 owl_mainwin_redisplay(owl_global_get_mainwin(&g));811 owl_global_set_needrefresh(&g);812 787 } 813 788 … … 819 794 if (shift > 0) { 820 795 owl_global_set_rightshift(&g, MAX(shift - 10, 0)); 821 owl_mainwin_redisplay(owl_global_get_mainwin(&g));822 owl_global_set_needrefresh(&g);823 796 } else { 824 797 owl_function_beep(); … … 1223 1196 if (owl_global_is_bell(&g)) { 1224 1197 beep(); 1225 owl_global_set_needrefresh(&g); /* do we really need this? */1226 1198 } 1227 1199 } … … 1252 1224 } 1253 1225 1254 void owl_function_set_cursor(WINDOW *win) 1255 { 1256 /* Be careful that this window is actually empty, otherwise panels get confused */ 1257 if (is_wintouched(win)) { 1258 owl_function_debugmsg("Warning: owl_function_set_cursor called on dirty window"); 1259 update_panels(); 1260 } 1261 wnoutrefresh(win); 1226 static void _dirty_everything(owl_window *w) { 1227 if (!owl_window_is_realized(w)) 1228 return; 1229 owl_window_dirty(w); 1230 owl_window_children_foreach(w, (GFunc)_dirty_everything, NULL); 1262 1231 } 1263 1232 1264 1233 void owl_function_full_redisplay(void) 1265 1234 { 1266 touchwin(owl_global_get_curs_recwin(&g)); 1267 touchwin(owl_global_get_curs_sepwin(&g)); 1268 touchwin(owl_global_get_curs_typwin(&g)); 1269 touchwin(owl_global_get_curs_msgwin(&g)); 1270 1271 sepbar(""); 1272 owl_function_makemsg(""); 1273 1274 owl_global_set_needrefresh(&g); 1235 _dirty_everything(owl_window_get_screen()); 1275 1236 } 1276 1237 … … 1284 1245 1285 1246 owl_popwin_up(pw); 1286 owl_global_push_context(&g, OWL_CTX_POPLESS, v, "popless"); 1287 owl_viewwin_init_text(v, owl_popwin_get_curswin(pw), 1288 owl_popwin_get_lines(pw), owl_popwin_get_cols(pw), 1289 text); 1290 owl_viewwin_redisplay(v); 1291 owl_global_set_needrefresh(&g); 1247 owl_global_push_context(&g, OWL_CTX_POPLESS, v, "popless", NULL); 1248 owl_viewwin_init_text(v, owl_popwin_get_content(pw), text); 1292 1249 } 1293 1250 … … 1301 1258 1302 1259 owl_popwin_up(pw); 1303 owl_global_push_context(&g, OWL_CTX_POPLESS, v, "popless"); 1304 owl_viewwin_init_fmtext(v, owl_popwin_get_curswin(pw), 1305 owl_popwin_get_lines(pw), owl_popwin_get_cols(pw), 1306 fm); 1307 owl_viewwin_redisplay(v); 1308 owl_global_set_needrefresh(&g); 1260 owl_global_push_context(&g, OWL_CTX_POPLESS, v, "popless", NULL); 1261 owl_viewwin_init_fmtext(v, owl_popwin_get_content(pw), fm); 1309 1262 } 1310 1263 … … 1566 1519 /* redisplay */ 1567 1520 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 1568 owl_global_set_needrefresh(&g);1569 1521 } 1570 1522 … … 1572 1524 { 1573 1525 owl_global_set_typwin_lines(&g, newsize); 1574 owl_ global_set_relayout_pending(&g);1526 owl_mainpanel_layout_contents(&g.mainpanel); 1575 1527 } 1576 1528 … … 1686 1638 } 1687 1639 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 1688 owl_global_set_needrefresh(&g);1689 1640 } else { 1690 1641 owl_function_error("No message with id %d: unable to mark for (un)delete",id); … … 1722 1673 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 1723 1674 owl_function_makemsg("%i messages marked for deletion", count); 1724 owl_global_set_needrefresh(&g);1725 1675 } 1726 1676 … … 1927 1877 1928 1878 owl_editwin_set_locktext(tw, "command: "); 1929 owl_global_set_needrefresh(&g);1930 1879 1931 1880 owl_editwin_insert_string(tw, line); 1932 owl_editwin_redisplay(tw); 1933 1934 owl_global_push_context(&g, OWL_CTX_EDITLINE, tw, "editline"); 1881 1882 owl_global_push_context(&g, OWL_CTX_EDITLINE, tw, "editline", owl_global_get_typwin_window(&g)); 1935 1883 owl_editwin_set_callback(tw, owl_callback_command); 1936 1884 } … … 1943 1891 1944 1892 owl_editwin_set_locktext(tw, line); 1945 owl_global_set_needrefresh(&g); 1946 1947 owl_editwin_redisplay(tw); 1948 1949 owl_global_push_context(&g, OWL_CTX_EDITRESPONSE, tw, "editresponse"); 1893 1894 owl_global_push_context(&g, OWL_CTX_EDITRESPONSE, tw, "editresponse", owl_global_get_typwin_window(&g)); 1950 1895 return tw; 1951 1896 } … … 1960 1905 1961 1906 owl_editwin_set_locktext(tw, line); 1962 owl_global_set_needrefresh(&g); 1963 1964 owl_editwin_redisplay(tw); 1965 1966 owl_global_push_context(&g, OWL_CTX_EDITRESPONSE, tw, "editresponse"); 1907 1908 owl_global_push_context(&g, OWL_CTX_EDITRESPONSE, tw, "editresponse", owl_global_get_typwin_window(&g)); 1967 1909 return tw; 1968 1910 } … … 1999 1941 pclose(p); 2000 1942 2001 if (type == OWL_OUTPUT_POPUP) { 2002 owl_function_popless_text(out); 2003 } else if (type == OWL_OUTPUT_RETURN) { 1943 if (type == OWL_OUTPUT_RETURN) { 2004 1944 owl_free(newbuff); 2005 1945 return out; 2006 1946 } else if (type == OWL_OUTPUT_ADMINMSG) { 2007 1947 owl_function_adminmsg(buff, out); 2008 } else {2009 owl_function_popless_text(out);2010 1948 } 2011 1949 owl_free(out); … … 2040 1978 } else if (type == OWL_OUTPUT_RETURN) { 2041 1979 return perlout; 2042 } else {2043 owl_function_popless_text(perlout);2044 1980 } 2045 1981 owl_free(perlout); … … 2133 2069 } 2134 2070 owl_filter_set_fgcolor(f, owl_util_string_to_color(argv[3])); 2135 owl_global_set_needrefresh(&g);2136 2071 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 2137 2072 return; … … 2148 2083 } 2149 2084 owl_filter_set_bgcolor(f, owl_util_string_to_color(argv[3])); 2150 owl_global_set_needrefresh(&g);2151 2085 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 2152 2086 return; … … 2177 2111 owl_function_change_currentview_filter(argv[1]); 2178 2112 } 2179 owl_global_set_needrefresh(&g);2180 2113 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 2181 2114 } … … 2505 2438 2506 2439 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 2440 } 2441 2442 static char *owl_function_smartfilter_cc(const owl_message *m) { 2443 const char *ccs; 2444 char *filtname; 2445 char *text; 2446 owl_filter *f; 2447 2448 ccs = owl_message_get_attribute_value(m, "zephyr_ccs"); 2449 2450 filtname = owl_sprintf("conversation-%s", ccs); 2451 owl_text_tr(filtname, ' ', '-'); 2452 2453 if (owl_global_get_filter(&g, filtname)) { 2454 return filtname; 2455 } 2456 2457 text = owl_sprintf("type ^zephyr$ and filter personal and " 2458 "zephyr_ccs ^%s%s%s$", 2459 owl_getquoting(ccs), ccs, owl_getquoting(ccs)); 2460 2461 f = owl_filter_new_fromstring(filtname, text); 2462 2463 owl_global_add_filter(&g, f); 2464 2465 owl_free(text); 2466 2467 return filtname; 2507 2468 } 2508 2469 … … 2560 2521 if (owl_message_is_type_zephyr(m)) { 2561 2522 if (owl_message_is_personal(m) || owl_message_is_loginout(m)) { 2523 if (owl_message_get_attribute_value(m, "zephyr_ccs") != NULL) { 2524 return owl_function_smartfilter_cc(m); 2525 } 2526 2562 2527 if (owl_message_is_direction_in(m)) { 2563 2528 zperson=short_zuser(owl_message_get_sender(m)); … … 2689 2654 owl_filter_set_fgcolor(f, owl_util_string_to_color(fgcolor)); 2690 2655 2691 owl_global_set_needrefresh(&g);2692 2656 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 2693 2657 return(0); … … 2853 2817 km = owl_keyhandler_get_keymap(kh, kmname); 2854 2818 owl_fmtext_append_bold(&fm, "\n\n----------------------------------------------------------------------------------------------------\n\n"); 2855 owl_keymap_get_details(km, &fm );2819 owl_keymap_get_details(km, &fm, 0); 2856 2820 } 2857 2821 owl_fmtext_append_normal(&fm, "\n"); … … 2879 2843 km = owl_keyhandler_get_keymap(owl_global_get_keyhandler(&g), name); 2880 2844 if (km) { 2881 owl_keymap_get_details(km, &fm );2845 owl_keymap_get_details(km, &fm, 1); 2882 2846 } else { 2883 2847 owl_fmtext_append_normal(&fm, "No such keymap...\n"); … … 3403 3367 { 3404 3368 va_list ap; 3405 char buff[2048]; 3406 3407 if (!owl_global_get_curs_msgwin(&g)) return; 3369 char *str; 3408 3370 3409 3371 va_start(ap, fmt); 3410 werase(owl_global_get_curs_msgwin(&g)); 3411 3412 vsnprintf(buff, 2048, fmt, ap); 3413 owl_function_debugmsg("makemsg: %s", buff); 3414 waddstr(owl_global_get_curs_msgwin(&g), buff); 3415 owl_global_set_needrefresh(&g); 3372 str = g_strdup_vprintf(fmt, ap); 3416 3373 va_end(ap); 3374 3375 owl_function_debugmsg("makemsg: %s", str); 3376 owl_msgwin_set_text(&g.msgwin, str); 3417 3377 } 3418 3378 -
global.c
r26ad412 r26ad412 13 13 #endif 14 14 15 static void _owl_global_init_windows(owl_global *g); 16 15 17 void owl_global_init(owl_global *g) { 16 18 struct hostent *hent; … … 18 20 char *cd; 19 21 20 g->malloced=0; 21 g->freed=0; 22 g_type_init(); 22 23 23 24 gethostname(hostname, MAXHOSTNAMELEN); … … 29 30 } 30 31 32 g->lines=LINES; 33 g->cols=COLS; 34 /* We shouldn't need this if we initialize lines and cols before the first 35 * owl_window_get_screen, but to be safe, we synchronize. */ 36 owl_window_resize(owl_window_get_screen(), g->lines, g->cols); 37 31 38 g->context_stack = NULL; 32 owl_global_push_context(g, OWL_CTX_STARTUP, NULL, NULL );39 owl_global_push_context(g, OWL_CTX_STARTUP, NULL, NULL, NULL); 33 40 34 41 g->curmsg=0; 35 42 g->topmsg=0; 36 43 g->markedmsgid=-1; 37 g->needrefresh=1;38 44 g->startupargs=NULL; 39 45 40 46 owl_variable_dict_setup(&(g->vars)); 41 42 g->lines=LINES;43 g->cols=COLS;44 47 45 48 g->rightshift=0; … … 53 56 g->filterlist = NULL; 54 57 owl_list_create(&(g->puntlist)); 55 owl_list_create(&(g->messagequeue));58 g->messagequeue = g_queue_new(); 56 59 owl_dict_create(&(g->styledict)); 57 60 g->curmsg_vert_offset=0; 58 61 g->resizepending=0; 59 g->relayoutpending = 0;60 62 g->direction=OWL_DIRECTION_DOWNWARDS; 61 63 g->zaway=0; … … 79 81 g->nextmsgid=0; 80 82 81 _owl_global_setup_windows(g);82 83 83 /* Fill in some variables which don't have constant defaults */ 84 84 /* TODO: come back later and check passwd file first */ … … 92 92 93 93 owl_messagelist_create(&(g->msglist)); 94 owl_mainwin_init(&(g->mw)); 95 owl_popwin_init(&(g->pw));94 95 _owl_global_init_windows(g); 96 96 97 97 g->aim_screenname=NULL; … … 112 112 g->zaldlist = NULL; 113 113 g->pseudologin_notify = 0; 114 115 owl_obarray_init(&(g->obarray));116 114 117 115 owl_message_init_fmtext_cache(); … … 120 118 g->timerlist = NULL; 121 119 g->interrupted = FALSE; 120 } 121 122 static void _owl_global_init_windows(owl_global *g) 123 { 124 /* Create the main window */ 125 owl_mainpanel_init(&(g->mainpanel)); 126 127 /* Create the widgets */ 128 owl_mainwin_init(&(g->mw), g->mainpanel.recwin); 129 owl_popwin_init(&(g->pw)); 130 owl_msgwin_init(&(g->msgwin), g->mainpanel.msgwin); 131 owl_sepbar_init(g->mainpanel.sepwin); 132 133 owl_window_set_default_cursor(g->mainpanel.sepwin); 122 134 123 135 /* set up a pad for input */ … … 126 138 keypad(g->input_pad, 1); 127 139 meta(g->input_pad, 1); 140 } 141 142 void owl_global_sepbar_dirty(owl_global *g) 143 { 144 owl_window_dirty(g->mainpanel.sepwin); 128 145 } 129 146 … … 158 175 } 159 176 160 void _owl_global_setup_windows(owl_global *g) {161 int cols, typwin_lines;162 163 cols=g->cols;164 typwin_lines=owl_global_get_typwin_lines(g);165 166 /* set the new window sizes */167 g->recwinlines=g->lines-(typwin_lines+2);168 if (g->recwinlines<0) {169 /* gotta deal with this */170 g->recwinlines=0;171 }172 173 /* create the new windows */174 _owl_panel_set_window(&g->recpan, newwin(g->recwinlines, cols, 0, 0));175 _owl_panel_set_window(&g->seppan, newwin(1, cols, g->recwinlines, 0));176 _owl_panel_set_window(&g->msgpan, newwin(1, cols, g->recwinlines+1, 0));177 _owl_panel_set_window(&g->typpan, newwin(typwin_lines, cols, g->recwinlines+2, 0));178 179 if (g->tw)180 owl_editwin_set_curswin(g->tw, owl_global_get_curs_typwin(g), typwin_lines, g->cols);181 182 idlok(owl_global_get_curs_typwin(g), FALSE);183 idlok(owl_global_get_curs_recwin(g), FALSE);184 idlok(owl_global_get_curs_sepwin(g), FALSE);185 idlok(owl_global_get_curs_msgwin(g), FALSE);186 187 wmove(owl_global_get_curs_typwin(g), 0, 0);188 }189 190 177 owl_context *owl_global_get_context(owl_global *g) { 191 178 if (!g->context_stack) … … 194 181 } 195 182 196 static void owl_global_lookup_keymap(owl_global *g) { 197 owl_context *c = owl_global_get_context(g); 198 if (!c || !c->keymap) 183 static void owl_global_activate_context(owl_global *g, owl_context *c) { 184 if (!c) 199 185 return; 200 186 201 if (!owl_keyhandler_activate(owl_global_get_keyhandler(g), c->keymap)) { 202 owl_function_error("Unable to activate keymap '%s'", c->keymap); 203 } 204 } 205 206 void owl_global_push_context(owl_global *g, int mode, void *data, const char *keymap) { 187 if (c->keymap) { 188 if (!owl_keyhandler_activate(owl_global_get_keyhandler(g), c->keymap)) { 189 owl_function_error("Unable to activate keymap '%s'", c->keymap); 190 } 191 } 192 owl_window_set_cursor(c->cursor); 193 } 194 195 void owl_global_push_context(owl_global *g, int mode, void *data, const char *keymap, owl_window *cursor) { 207 196 owl_context *c; 208 197 if (!(mode & OWL_CTX_MODE_BITS)) … … 211 200 c->mode = mode; 212 201 c->data = data; 202 c->cursor = cursor ? g_object_ref(cursor) : NULL; 213 203 c->keymap = owl_strdup(keymap); 214 204 g->context_stack = g_list_prepend(g->context_stack, c); 215 owl_global_ lookup_keymap(g);205 owl_global_activate_context(g, owl_global_get_context(g)); 216 206 } 217 207 … … 223 213 g->context_stack = g_list_delete_link(g->context_stack, 224 214 g->context_stack); 215 if (c->cursor) 216 g_object_unref(c->cursor); 225 217 owl_free(c->keymap); 226 218 owl_free(c); 227 owl_global_ lookup_keymap(g);219 owl_global_activate_context(g, owl_global_get_context(g)); 228 220 } 229 221 … … 237 229 238 230 int owl_global_get_recwin_lines(const owl_global *g) { 239 return (g->recwinlines);231 return g->mainpanel.recwinlines; 240 232 } 241 233 … … 303 295 } 304 296 305 /* curses windows */ 306 307 WINDOW *owl_global_get_curs_recwin(const owl_global *g) { 308 return panel_window(g->recpan); 309 } 310 311 WINDOW *owl_global_get_curs_sepwin(const owl_global *g) { 312 return panel_window(g->seppan); 313 } 314 315 WINDOW *owl_global_get_curs_msgwin(const owl_global *g) { 316 return panel_window(g->msgpan); 317 } 318 319 WINDOW *owl_global_get_curs_typwin(const owl_global *g) { 320 return panel_window(g->typpan); 297 /* underlying owl_windows */ 298 299 owl_window *owl_global_get_typwin_window(const owl_global *g) { 300 return g->mainpanel.typwin; 321 301 } 322 302 … … 327 307 } 328 308 329 /* refresh */330 331 int owl_global_is_needrefresh(const owl_global *g) {332 if (g->needrefresh==1) return(1);333 return(0);334 }335 336 void owl_global_set_needrefresh(owl_global *g) {337 g->needrefresh=1;338 }339 340 void owl_global_set_noneedrefresh(owl_global *g) {341 g->needrefresh=0;342 }343 344 309 /* variable dictionary */ 345 310 … … 357 322 358 323 void owl_global_set_rightshift(owl_global *g, int i) { 359 g->rightshift=i; 324 g->rightshift = i; 325 owl_mainwin_redisplay(owl_global_get_mainwin(g)); 360 326 } 361 327 … … 372 338 owl_function_resize_typwin(owl_global_get_typwin_lines(g) + d); 373 339 374 g->tw = owl_editwin_new(owl_global_get_curs_typwin(g), 340 if (g->typwin_erase_id) { 341 g_signal_handler_disconnect(owl_global_get_typwin_window(g), g->typwin_erase_id); 342 g->typwin_erase_id = 0; 343 } 344 345 g->tw = owl_editwin_new(owl_global_get_typwin_window(g), 375 346 owl_global_get_typwin_lines(g), 376 347 g->cols, … … 385 356 owl_function_resize_typwin(owl_global_get_typwin_lines(g) - d); 386 357 387 werase(owl_global_get_curs_typwin(g)); 358 if (!g->typwin_erase_id) { 359 g->typwin_erase_id = 360 g_signal_connect(owl_global_get_typwin_window(g), "redraw", G_CALLBACK(owl_window_erase_cb), NULL); 361 } 362 owl_window_dirty(owl_global_get_typwin_window(g)); 363 388 364 g->tw = NULL; 389 365 } … … 393 369 void owl_global_set_resize_pending(owl_global *g) { 394 370 g->resizepending=1; 395 }396 397 void owl_global_set_relayout_pending(owl_global *g) {398 g->relayoutpending = 1;399 371 } 400 372 … … 476 448 * fail. 477 449 */ 478 static void _owl_global_get_size(int *lines, int *cols) {450 void owl_global_get_terminal_size(int *lines, int *cols) { 479 451 struct winsize size; 480 452 /* get the new size */ … … 493 465 } 494 466 495 void owl_global_ resize(owl_global *g, int x, int y) {496 /* resize the screen. If x or yis 0 use the terminal size */467 void owl_global_check_resize(owl_global *g) { 468 /* resize the screen. If lines or cols is 0 use the terminal size */ 497 469 if (!g->resizepending) return; 498 470 g->resizepending = 0; 499 471 500 _owl_global_get_size(&g->lines, &g->cols); 501 if (x != 0) { 502 g->lines = x; 503 } 504 if (y != 0) { 505 g->cols = y; 506 } 507 508 resizeterm(g->lines, g->cols); 472 owl_global_get_terminal_size(&g->lines, &g->cols); 473 owl_window_resize(owl_window_get_screen(), g->lines, g->cols); 509 474 510 475 owl_function_debugmsg("New size is %i lines, %i cols.", g->lines, g->cols); 511 owl_global_set_relayout_pending(g);512 }513 514 void owl_global_relayout(owl_global *g) {515 owl_popwin *pw;516 owl_viewwin *vw;517 518 if (!g->relayoutpending) return;519 g->relayoutpending = 0;520 521 owl_function_debugmsg("Relayouting...");522 523 /* re-initialize the windows */524 _owl_global_setup_windows(g);525 526 /* in case any styles rely on the current width */527 owl_messagelist_invalidate_formats(owl_global_get_msglist(g));528 529 /* recalculate the topmsg to make sure the current message is on530 * screen */531 owl_function_calculate_topmsg(OWL_DIRECTION_NONE);532 533 /* recreate the popwin */534 pw = owl_global_get_popwin(g);535 if (owl_popwin_is_active(pw)) {536 /*537 * This is somewhat hacky; we probably want a proper windowing layer. We538 * destroy the popwin and recreate it. Then the viewwin is redirected to539 * the new window.540 */541 vw = owl_global_get_viewwin(g);542 owl_popwin_close(pw);543 owl_popwin_up(pw);544 owl_viewwin_set_curswin(vw, owl_popwin_get_curswin(pw),545 owl_popwin_get_lines(pw), owl_popwin_get_cols(pw));546 owl_viewwin_redisplay(vw);547 }548 549 /* refresh stuff */550 g->needrefresh=1;551 owl_mainwin_redisplay(&(g->mw));552 sepbar(NULL);553 if (g->tw)554 owl_editwin_redisplay(g->tw);555 else556 werase(owl_global_get_curs_typwin(g));557 558 owl_function_full_redisplay();559 560 owl_function_makemsg("");561 476 } 562 477 … … 628 543 629 544 void owl_global_set_curmsg_vert_offset(owl_global *g, int i) { 630 g->curmsg_vert_offset =i;545 g->curmsg_vert_offset = i; 631 546 } 632 547 … … 864 779 void owl_global_messagequeue_addmsg(owl_global *g, owl_message *m) 865 780 { 866 owl_list_append_element(&(g->messagequeue), m);781 g_queue_push_tail(g->messagequeue, m); 867 782 } 868 783 … … 875 790 owl_message *out; 876 791 877 if ( owl_list_get_size(&(g->messagequeue))==0) return(NULL);878 out=owl_list_get_element(&(g->messagequeue), 0);879 o wl_list_remove_element(&(g->messagequeue), 0);880 return (out);792 if (g_queue_is_empty(g->messagequeue)) 793 return NULL; 794 out = g_queue_pop_head(g->messagequeue); 795 return out; 881 796 } 882 797 883 798 int owl_global_messagequeue_pending(owl_global *g) 884 799 { 885 if (owl_list_get_size(&(g->messagequeue))==0) return(0); 886 return(1); 800 return !g_queue_is_empty(g->messagequeue); 887 801 } 888 802 … … 1012 926 } 1013 927 1014 const char * owl_global_intern(owl_global *g, const char * string)1015 {1016 return owl_obarray_insert(&(g->obarray), string);1017 }1018 1019 928 owl_list *owl_global_get_io_dispatch_list(owl_global *g) 1020 929 { … … 1052 961 } filters[] = { 1053 962 { "personal", 1054 "private ^true$ and ( not type ^zephyr$ or " 1055 "( class ^message and ( instance ^personal$ or instance ^urgent$ ) ) )" }, 963 "isprivate ^true$ and ( not type ^zephyr$ or ( class ^message ) )" }, 1056 964 { "trash", 1057 965 "class ^mail$ or opcode ^ping$ or type ^admin$ or ( not login ^none$ )" }, -
keymap.c
r8a921b5 r44cc9ab 1 1 #include <string.h> 2 2 #include "owl.h" 3 4 static void _owl_keymap_format_bindings(const owl_keymap *km, owl_fmtext *fm); 5 static void _owl_keymap_format_with_parents(const owl_keymap *km, owl_fmtext *fm); 3 6 4 7 /* returns 0 on success */ … … 9 12 if ((km->desc = owl_strdup(desc)) == NULL) return(-1); 10 13 if (0 != owl_list_create(&km->bindings)) return(-1); 11 km-> submap= NULL;14 km->parent = NULL; 12 15 km->default_fn = default_fn; 13 16 km->prealways_fn = prealways_fn; … … 24 27 } 25 28 26 void owl_keymap_set_ submap(owl_keymap *km, const owl_keymap *submap)27 { 28 km-> submap = submap;29 void owl_keymap_set_parent(owl_keymap *km, const owl_keymap *parent) 30 { 31 km->parent = parent; 29 32 } 30 33 … … 86 89 87 90 /* Appends details about the keymap to fm */ 88 void owl_keymap_get_details(const owl_keymap *km, owl_fmtext *fm) 89 { 90 int i, nbindings; 91 const owl_keybinding *kb; 92 91 void owl_keymap_get_details(const owl_keymap *km, owl_fmtext *fm, int recurse) 92 { 93 93 owl_fmtext_append_bold(fm, "KEYMAP - "); 94 94 owl_fmtext_append_bold(fm, km->name); … … 99 99 owl_fmtext_append_normal(fm, "\n"); 100 100 } 101 if (km-> submap) {102 owl_fmtext_append_normal(fm, OWL_TABSTR "Has submap: ");103 owl_fmtext_append_normal(fm, km-> submap->name);101 if (km->parent) { 102 owl_fmtext_append_normal(fm, OWL_TABSTR "Has parent: "); 103 owl_fmtext_append_normal(fm, km->parent->name); 104 104 owl_fmtext_append_normal(fm, "\n"); 105 105 } … … 119 119 120 120 owl_fmtext_append_bold(fm, "\nKey bindings:\n\n"); 121 if (recurse) { 122 _owl_keymap_format_with_parents(km, fm); 123 } else { 124 _owl_keymap_format_bindings(km, fm); 125 } 126 } 127 128 static void _owl_keymap_format_with_parents(const owl_keymap *km, owl_fmtext *fm) 129 { 130 while (km) { 131 _owl_keymap_format_bindings(km, fm); 132 km = km->parent; 133 if (km) { 134 owl_fmtext_append_bold(fm, "\nInherited from "); 135 owl_fmtext_append_bold(fm, km->name); 136 owl_fmtext_append_bold(fm, ":\n\n"); 137 } 138 } 139 } 140 141 static void _owl_keymap_format_bindings(const owl_keymap *km, owl_fmtext *fm) 142 { 143 int i, nbindings; 144 const owl_keybinding *kb; 145 121 146 nbindings = owl_list_get_size(&km->bindings); 122 147 for (i=0; i<nbindings; i++) { … … 248 273 } 249 274 250 /* deal with the always_fn for the map and submaps */251 for (km=kh->active; km; km=km-> submap) {275 /* deal with the always_fn for the map and parents */ 276 for (km=kh->active; km; km=km->parent) { 252 277 if (km->prealways_fn) { 253 278 km->prealways_fn(j); … … 256 281 257 282 /* search for a match. goes through active keymap and then 258 * through submaps... TODO: clean this up so we can pull283 * through parents... TODO: clean this up so we can pull 259 284 * keyhandler and keymap apart. */ 260 for (km=kh->active; km; km=km-> submap) {285 for (km=kh->active; km; km=km->parent) { 261 286 for (i=owl_list_get_size(&km->bindings)-1; i>=0; i--) { 262 287 kb = owl_list_get_element(&km->bindings, i); -
keys.c
r8a5b5a1 r5cc7e5e 30 30 "Text editing and command window", 31 31 owl_keys_editwin_default, NULL, owl_keys_editwin_postalways); 32 owl_keymap_set_ submap(km_editwin, km_global);32 owl_keymap_set_parent(km_editwin, km_global); 33 33 /* 34 34 BIND_CMD("F1", "help", ""); … … 99 99 "Multi-line text editing", 100 100 owl_keys_editwin_default, NULL, owl_keys_editwin_postalways); 101 owl_keymap_set_ submap(km_ew_multi, km_editwin);101 owl_keymap_set_parent(km_ew_multi, km_editwin); 102 102 103 103 BIND_CMD("UP", "edit:move-up-line", ""); … … 129 129 "Single-line text editing", 130 130 owl_keys_editwin_default, NULL, owl_keys_editwin_postalways); 131 owl_keymap_set_ submap(km_ew_onel, km_editwin);131 owl_keymap_set_parent(km_ew_onel, km_editwin); 132 132 133 133 BIND_CMD("C-u", "edit:delete-all", "Clears the entire line"); … … 154 154 "Single-line response to question", 155 155 owl_keys_editwin_default, NULL, owl_keys_editwin_postalways); 156 owl_keymap_set_ submap(km_ew_onel, km_editwin);156 owl_keymap_set_parent(km_ew_onel, km_editwin); 157 157 158 158 BIND_CMD("C-u", "edit:delete-all", "Clears the entire line"); … … 169 169 "Pop-up window (eg, help)", 170 170 owl_keys_default_invalid, NULL, owl_keys_popless_postalways); 171 owl_keymap_set_ submap(km_viewwin, km_global);171 owl_keymap_set_parent(km_viewwin, km_global); 172 172 173 173 BIND_CMD("SPACE", "popless:scroll-down-page", ""); … … 222 222 "Main window / message list", 223 223 owl_keys_default_invalid, owl_keys_recwin_prealways, NULL); 224 owl_keymap_set_ submap(km_mainwin, km_global);224 owl_keymap_set_parent(km_mainwin, km_global); 225 225 BIND_CMD("C-x C-c", "start-command quit", ""); 226 226 BIND_CMD("F1", "help", ""); … … 338 338 owl_editwin_post_process_char(e, j); 339 339 } 340 owl_global_set_needrefresh(&g);341 340 } 342 341 343 342 void owl_keys_popless_postalways(owl_input j) { 344 owl_viewwin *v = owl_global_get_viewwin(&g);345 const owl_popwin *pw = owl_global_get_popwin(&g);346 347 if (pw && owl_popwin_is_active(pw) && v) {348 owl_viewwin_redisplay(v);349 owl_global_set_needrefresh(&g);350 }351 343 } 352 344 -
logging.c
r91634ec r839697d 128 128 char filename[MAXPATHLEN], *logpath; 129 129 char *to, *temp; 130 GList *cc; 130 131 131 132 /* expand ~ in path names */ … … 135 136 if (owl_message_is_type_zephyr(m)) { 136 137 /* If this has CC's, do all but the "recipient" which we'll do below */ 137 to = owl_message_get_cc_without_recipient(m); 138 if (to != NULL) { 139 temp = strtok(to, " "); 140 while (temp != NULL) { 141 temp = short_zuser(temp); 142 snprintf(filename, MAXPATHLEN, "%s/%s", logpath, temp); 143 owl_log_append(m, filename); 144 temp = strtok(NULL, " "); 145 } 146 owl_free(to); 147 } 138 cc = owl_message_get_cc_without_recipient(m); 139 while (cc != NULL) { 140 temp = short_zuser(cc->data); 141 snprintf(filename, MAXPATHLEN, "%s/%s", logpath, temp); 142 owl_log_append(m, filename); 143 144 owl_free(cc->data); 145 cc = g_list_delete_link(cc, cc); 146 } 147 148 148 to = short_zuser(owl_message_get_recipient(m)); 149 149 } else if (owl_message_is_type_jabber(m)) { … … 325 325 * the sender, as well. 326 326 */ 327 char *cc, *temp; 327 char *temp; 328 GList *cc; 328 329 cc = owl_message_get_cc_without_recipient(m); 329 if (cc != NULL) { 330 temp = strtok(cc, " "); 331 while (temp != NULL) { 332 temp = short_zuser(temp); 333 if (strcasecmp(temp, frombuff) != 0) { 334 snprintf(filename, MAXPATHLEN, "%s/%s", logpath, temp); 335 owl_log_append(m, filename); 336 } 337 temp = strtok(NULL, " "); 330 while (cc != NULL) { 331 temp = short_zuser(cc->data); 332 if (strcasecmp(temp, frombuff) != 0) { 333 snprintf(filename, MAXPATHLEN, "%s/%s", logpath, temp); 334 owl_log_append(m, filename); 338 335 } 339 owl_free(cc); 336 337 owl_free(cc->data); 338 cc = g_list_delete_link(cc, cc); 340 339 } 341 340 } -
mainwin.c
rf449096 r5cc7e5e 1 1 #include "owl.h" 2 2 3 void owl_mainwin_init(owl_mainwin *mw) 3 static void owl_mainwin_redraw(owl_window *w, WINDOW *recwin, void *user_data); 4 static void owl_mainwin_resized(owl_window *w, void *user_data); 5 6 void owl_mainwin_init(owl_mainwin *mw, owl_window *window) 4 7 { 5 8 mw->curtruncated=0; 6 9 mw->lastdisplayed=-1; 10 mw->window = g_object_ref(window); 11 /* for now, just assume this object lasts forever */ 12 g_signal_connect(window, "redraw", G_CALLBACK(owl_mainwin_redraw), mw); 13 g_signal_connect(window, "resized", G_CALLBACK(owl_mainwin_resized), mw); 14 owl_window_dirty(window); 15 16 /* For now, we do not bother with connecting up dependencies; that'll be a 17 * future refactor of the mainwin */ 18 } 19 20 static void owl_mainwin_resized(owl_window *w, void *user_data) 21 { 22 owl_mainwin *mw = user_data; 23 24 /* in case any styles rely on the current width */ 25 owl_messagelist_invalidate_formats(owl_global_get_msglist(&g)); 26 27 /* recalculate the topmsg to make sure the current message is on 28 * screen */ 29 owl_function_calculate_topmsg(OWL_DIRECTION_NONE); 30 31 /* Schedule a redraw */ 32 owl_window_dirty(mw->window); 7 33 } 8 34 9 35 void owl_mainwin_redisplay(owl_mainwin *mw) 36 { 37 owl_window_dirty(mw->window); 38 } 39 40 static void owl_mainwin_redraw(owl_window *w, WINDOW *recwin, void *user_data) 10 41 { 11 42 owl_message *m; … … 13 44 int x, y, savey, recwinlines, start; 14 45 int topmsg, curmsg, markedmsgid, fgcolor, bgcolor; 15 WINDOW *recwin;16 46 const owl_view *v; 17 47 GList *fl; 18 48 const owl_filter *f; 49 owl_mainwin *mw = user_data; 19 50 20 recwin = owl_global_get_curs_recwin(&g);21 51 topmsg = owl_global_get_topmsg(&g); 22 52 curmsg = owl_global_get_curmsg(&g); … … 43 73 mw->curtruncated=0; 44 74 mw->lastdisplayed=-1; 45 owl_global_set_needrefresh(&g);46 75 return; 47 76 } … … 88 117 if (y+lines > recwinlines-1) { 89 118 isfull=1; 90 owl_message_curs_waddstr(m, owl_global_get_curs_recwin(&g),119 owl_message_curs_waddstr(m, recwin, 91 120 start, 92 121 start+recwinlines-y, … … 96 125 } else { 97 126 /* otherwise print the whole thing */ 98 owl_message_curs_waddstr(m, owl_global_get_curs_recwin(&g),127 owl_message_curs_waddstr(m, recwin, 99 128 start, 100 129 start+lines, … … 139 168 } 140 169 mw->lastdisplayed=i-1; 141 142 owl_global_set_needrefresh(&g);143 170 } 144 171 -
message.c
r9a7b4f2 rc314f39 61 61 owl_pair *p = NULL, *pair = NULL; 62 62 63 attrname = g_intern_string(attrname); 64 63 65 /* look for an existing pair with this key, */ 64 66 j=owl_list_get_size(&(m->attributes)); 65 67 for (i=0; i<j; i++) { 66 68 p=owl_list_get_element(&(m->attributes), i); 67 if ( !strcmp(owl_pair_get_key(p), attrname)) {69 if (owl_pair_get_key(p) == attrname) { 68 70 owl_free(owl_pair_get_value(p)); 69 71 pair = p; … … 74 76 if(pair == NULL) { 75 77 pair = owl_malloc(sizeof(owl_pair)); 76 owl_pair_create(pair, owl_global_intern(&g, attrname), NULL);78 owl_pair_create(pair, attrname, NULL); 77 79 owl_list_append_element(&(m->attributes), pair); 78 80 } … … 87 89 int i, j; 88 90 owl_pair *p; 91 GQuark quark; 92 93 quark = g_quark_try_string(attrname); 94 if (quark == 0) 95 /* don't bother inserting into string table */ 96 return NULL; 97 attrname = g_quark_to_string(quark); 89 98 90 99 j=owl_list_get_size(&(m->attributes)); 91 100 for (i=0; i<j; i++) { 92 101 p=owl_list_get_element(&(m->attributes), i); 93 if ( !strcmp(owl_pair_get_key(p), attrname)) {102 if (owl_pair_get_key(p) == attrname) { 94 103 return(owl_pair_get_value(p)); 95 104 } … … 496 505 void owl_message_set_hostname(owl_message *m, const char *hostname) 497 506 { 498 m->hostname =owl_global_intern(&g,hostname);507 m->hostname = g_intern_string(hostname); 499 508 } 500 509 … … 584 593 585 594 /* caller must free return value */ 586 char*owl_message_get_cc_without_recipient(const owl_message *m)587 { 588 char *cc, * out, *end, *shortuser, *recip;595 GList *owl_message_get_cc_without_recipient(const owl_message *m) 596 { 597 char *cc, *shortuser, *recip; 589 598 const char *user; 599 GList *out = NULL; 590 600 591 601 cc = owl_message_get_cc(m); … … 594 604 595 605 recip = short_zuser(owl_message_get_recipient(m)); 596 out = owl_malloc(strlen(cc) + 2);597 end = out;598 606 599 607 user = strtok(cc, " "); … … 601 609 shortuser = short_zuser(user); 602 610 if (strcasecmp(shortuser, recip) != 0) { 603 strcpy(end, user); 604 end[strlen(user)] = ' '; 605 end += strlen(user) + 1; 611 out = g_list_prepend(out, owl_strdup(user)); 606 612 } 607 613 owl_free(shortuser); 608 614 user = strtok(NULL, " "); 609 615 } 610 end[0] = '\0';611 616 612 617 owl_free(recip); 613 618 owl_free(cc); 614 615 if (strlen(out) == 0) {616 owl_free(out);617 out = NULL;618 }619 619 620 620 return(out); … … 732 732 owl_message_set_recipient(m, "looprecip"); 733 733 owl_message_set_isprivate(m); 734 } 735 736 void owl_message_save_ccs(owl_message *m) { 737 GList *cc; 738 char *tmp; 739 740 cc = owl_message_get_cc_without_recipient(m); 741 742 if (cc != NULL) { 743 GString *recips = g_string_new(""); 744 cc = g_list_prepend(cc, short_zuser(owl_message_get_sender(m))); 745 cc = g_list_prepend(cc, short_zuser(owl_message_get_recipient(m))); 746 cc = g_list_sort(cc, (GCompareFunc)strcasecmp); 747 748 while(cc != NULL) { 749 /* Collapse any identical entries */ 750 while (cc->next && strcasecmp(cc->data, cc->next->data) == 0) { 751 owl_free(cc->data); 752 cc = g_list_delete_link(cc, cc); 753 } 754 755 tmp = short_zuser(cc->data); 756 g_string_append(recips, tmp); 757 758 owl_free(tmp); 759 owl_free(cc->data); 760 cc = g_list_delete_link(cc, cc); 761 762 if (cc) 763 g_string_append_c(recips, ' '); 764 } 765 766 owl_message_set_attribute(m, "zephyr_ccs", recips->str); 767 g_string_free(recips, true); 768 } 734 769 } 735 770 … … 869 904 } 870 905 } 906 907 owl_message_save_ccs(m); 871 908 } 872 909 #else … … 963 1000 owl_message_set_isprivate(m); 964 1001 } 1002 1003 owl_message_save_ccs(m); 965 1004 } 966 1005 -
owl.c
rd12a8c7 r205e164 137 137 tcgetattr(0, &tio); 138 138 tio.c_iflag &= ~(ISTRIP|IEXTEN); 139 tio.c_cc[VQUIT] = 0;140 tio.c_cc[VSUSP] = 0;139 tio.c_cc[VQUIT] = fpathconf(STDIN, _PC_VDISABLE); 140 tio.c_cc[VSUSP] = fpathconf(STDIN, _PC_VDISABLE); 141 141 tcsetattr(0, TCSAFLUSH, &tio); 142 142 … … 240 240 /* log the message if we need to */ 241 241 owl_log_message(m); 242 /* redraw the sepbar; TODO: don't violate layering */ 243 owl_global_sepbar_dirty(&g); 242 244 243 245 return 1; … … 272 274 /* this should be optimized to not run if the new messages won't be displayed */ 273 275 owl_mainwin_redisplay(owl_global_get_mainwin(&g)); 274 sepbar(NULL);275 owl_global_set_needrefresh(&g);276 276 } 277 277 return newmsgs; … … 428 428 { 429 429 /* if a resize has been scheduled, deal with it */ 430 owl_global_resize(&g, 0, 0); 431 /* also handle relayouts */ 432 owl_global_relayout(&g); 433 430 owl_global_check_resize(&g); 434 431 /* update the terminal if we need to */ 435 if (owl_global_is_needrefresh(&g)) { 436 /* these are here in case a relayout changes the windows */ 437 WINDOW *sepwin = owl_global_get_curs_sepwin(&g); 438 WINDOW *typwin = owl_global_get_curs_typwin(&g); 439 440 /* push all changed windows to screen */ 441 update_panels(); 442 /* leave the cursor in the appropriate window */ 443 if (!owl_popwin_is_active(owl_global_get_popwin(&g)) 444 && owl_global_get_typwin(&g)) { 445 owl_function_set_cursor(typwin); 446 } else { 447 owl_function_set_cursor(sepwin); 448 } 449 doupdate(); 450 owl_global_set_noneedrefresh(&g); 451 } 432 owl_window_redraw_scheduled(); 452 433 return 0; 453 434 } … … 517 498 518 499 owl_global_pop_context(&g); 519 owl_global_push_context(&g, OWL_CTX_READCONFIG, NULL, NULL );500 owl_global_push_context(&g, OWL_CTX_READCONFIG, NULL, NULL, NULL); 520 501 521 502 perlerr=owl_perlconfig_initperl(opts.configfile, &argc, &argv, &env); … … 561 542 "-----------------------------------------------------------------m-m---\n" 562 543 ); 563 sepbar(NULL);564 544 565 545 /* process the startup file */ … … 585 565 586 566 owl_global_pop_context(&g); 587 owl_global_push_context(&g, OWL_CTX_READCONFIG|OWL_CTX_RECV, NULL, "recv"); 588 589 /* If we ever deprecate the mainloop hook, remove this. */ 590 owl_select_add_timer(0, 1, owl_perlconfig_mainloop, NULL, NULL); 567 owl_global_push_context(&g, OWL_CTX_READCONFIG|OWL_CTX_RECV, NULL, "recv", NULL); 591 568 592 569 owl_select_add_pre_select_action(owl_refresh_pre_select_action, NULL, NULL); -
owl.h
r26ad412 r26ad412 60 60 typedef void HV; 61 61 #endif 62 63 #include "window.h" 62 64 63 65 #ifdef GIT_VERSION … … 308 310 void *data; /* determined by mode */ 309 311 char *keymap; 312 owl_window *cursor; 310 313 } owl_context; 311 314 … … 344 347 345 348 typedef struct _owl_zwrite { 349 char *cmd; 346 350 char *zwriteline; 347 351 char *class; … … 394 398 int lasttruncated; 395 399 int lastdisplayed; 400 owl_window *window; 396 401 } owl_mainwin; 397 402 … … 401 406 int topline; 402 407 int rightshift; 403 int winlines, wincols;404 WINDOW *curswin;408 owl_window *window; 409 gulong sig_redraw_id; 405 410 void (*onclose_hook) (struct _owl_viewwin *vwin, void *data); 406 411 void *onclose_hook_data; … … 408 413 409 414 typedef struct _owl_popwin { 410 PANEL *borderpanel; 411 PANEL *poppanel; 412 int lines; 413 int cols; 415 owl_window *border; 416 owl_window *content; 414 417 int active; 415 418 } owl_popwin; 419 420 typedef struct _owl_msgwin { 421 char *msg; 422 owl_window *window; 423 gulong redraw_id; 424 } owl_msgwin; 416 425 417 426 typedef struct _owl_messagelist { … … 463 472 typedef struct _owl_editwin_excursion owl_editwin_excursion; 464 473 474 typedef struct _owl_mainpanel { 475 owl_window *panel; 476 owl_window *typwin; 477 owl_window *sepwin; 478 owl_window *msgwin; 479 owl_window *recwin; 480 int recwinlines; 481 } owl_mainpanel; 482 465 483 typedef struct _owl_keybinding { 466 484 int *keys; /* keypress stack */ … … 476 494 char *desc; /* description */ 477 495 owl_list bindings; /* key bindings */ 478 const struct _owl_keymap * submap; /* submap*/496 const struct _owl_keymap *parent; /* parent */ 479 497 void (*default_fn)(owl_input j); /* default action (takes a keypress) */ 480 498 void (*prealways_fn)(owl_input j); /* always called before a keypress is received */ … … 521 539 short **pairs; 522 540 } owl_colorpair_mgr; 523 524 typedef struct _owl_obarray {525 owl_list strings;526 } owl_obarray;527 541 528 542 typedef struct _owl_io_dispatch { … … 550 564 } owl_popexec; 551 565 566 typedef struct _OwlGlobalNotifier OwlGlobalNotifier; 567 552 568 typedef struct _owl_global { 553 569 owl_mainwin mw; 554 570 owl_popwin pw; 571 owl_msgwin msgwin; 555 572 owl_history cmdhist; /* command history */ 556 573 owl_history msghist; /* outgoing message history */ … … 570 587 owl_messagelist msglist; 571 588 WINDOW *input_pad; 572 PANEL *recpan, *seppan, *msgpan, *typpan;573 int needrefresh;589 owl_mainpanel mainpanel; 590 gulong typwin_erase_id; 574 591 int rightshift; 575 592 volatile sig_atomic_t resizepending; 576 int relayoutpending;577 int recwinlines;578 593 char *thishost; 579 594 char *homedir; … … 599 614 owl_colorpair_mgr cpmgr; 600 615 pid_t newmsgproc_pid; 601 int malloced, freed;602 616 owl_regex search_re; 603 617 aim_session_t aimsess; … … 610 624 char *aim_screenname_for_filters; /* currently logged in AIM screen name */ 611 625 owl_buddylist buddylist; /* list of logged in AIM buddies */ 612 owl_list messagequeue;/* for queueing up aim and other messages */626 GQueue *messagequeue; /* for queueing up aim and other messages */ 613 627 owl_dict styledict; /* global dictionary of available styles */ 614 628 char *response; /* response to the last question asked */ … … 623 637 int pseudologin_notify; 624 638 struct termios startup_tio; 625 owl_obarray obarray;626 639 owl_list io_dispatch_list; 627 640 owl_list psa_list; -
perl/lib/BarnOwl/Hooks.pm
rb30c256 r3aa0522 79 79 our %EXPORT_TAGS = (all => [@EXPORT_OK]); 80 80 81 use BarnOwl::MainLoopCompatHook; 82 81 83 our $startup = BarnOwl::Hook->new; 82 84 our $shutdown = BarnOwl::Hook->new; 83 85 our $receiveMessage = BarnOwl::Hook->new; 84 86 our $newMessage = BarnOwl::Hook->new; 85 our $mainLoop = BarnOwl:: Hook->new;87 our $mainLoop = BarnOwl::MainLoopCompatHook->new; 86 88 our $getBuddyList = BarnOwl::Hook->new; 87 89 our $getQuickstart = BarnOwl::Hook->new; … … 162 164 } 163 165 166 $mainLoop->check_owlconf(); 164 167 $startup->run(0); 165 168 BarnOwl::startup() if *BarnOwl::startup{CODE}; … … 186 189 187 190 BarnOwl::new_msg($m) if *BarnOwl::new_msg{CODE}; 188 }189 190 sub _mainloop_hook {191 $mainLoop->run;192 BarnOwl::mainloop_hook() if *BarnOwl::mainloop_hook{CODE};193 191 } 194 192 -
perl/lib/BarnOwl/Message/Generic.pm
ree183be r5d1324f 6 6 use base qw( BarnOwl::Message ); 7 7 8 sub body { "" } 9 8 10 9 11 1; -
perl/lib/BarnOwl/Style/Default.pm
r0fe69d2 r08544e0 32 32 my $m = shift; 33 33 return $m->is_personal && $m->direction eq "in"; 34 } 35 36 sub maybe { 37 my $x = shift; 38 return defined($x) ? $x : ""; 34 39 } 35 40 … … 99 104 $header .= ' / ' . $self->humanize($m->subcontext, 1); 100 105 } 101 $header .= ' / @b{' . $m->pretty_sender. '}';106 $header .= ' / @b{' . maybe($m->pretty_sender) . '}'; 102 107 } 103 108 -
perl/lib/BarnOwl/Timer.pm
ree183be r8d16e58 21 21 } 22 22 23 sub stop { 24 my $self = shift; 25 if(defined($self->{timer})) { 26 BarnOwl::Internal::remove_timer($self->{timer}); 27 undef $self->{timer}; 28 } 29 } 30 23 31 sub do_callback { 24 32 my $self = shift; … … 28 36 sub DESTROY { 29 37 my $self = shift; 30 if(defined($self->{timer})) { 31 BarnOwl::Internal::remove_timer($self->{timer}); 32 } 38 $self->stop; 33 39 } 34 40 -
perl/modules/Jabber/lib/BarnOwl/Message/Jabber.pm
rc854e74 r2f25537 20 20 sub to { shift->{to} }; 21 21 sub room { shift->{room} }; 22 sub nick { shift->{nick} }; 22 23 sub subject { shift->{subject} }; 23 24 sub status { shift->{status} } … … 41 42 sub long_sender { 42 43 my $self = shift; 44 if ($self->jtype eq 'groupchat' && $self->nick) { 45 my $from_jid = Net::Jabber::JID->new($self->from); 46 if ($from_jid->GetJID('base') eq $self->room && 47 $from_jid->GetResource() eq $self->nick) { 48 return $self->nick; 49 } 50 } 43 51 return $self->from; 44 52 } … … 77 85 } elsif ($self->jtype eq 'groupchat') { 78 86 my $room = $self->room; 79 $filter = "jabber-room-$room"; 80 BarnOwl::command(qw[filter], $filter, 81 qw[type ^jabber$ and room], "^\Q$room\E\$"); 87 if ($inst) { 88 my $subject = $self->subject; 89 $filter = "jabber-room-$room-subject-$subject"; 90 BarnOwl::command(qw[filter], $filter, 91 qw[type ^jabber$ and room], "^\Q$room\E\$", 92 qw[and subject], "^\Q$subject\E\$"); 93 } else { 94 $filter = "jabber-room-$room"; 95 BarnOwl::command(qw[filter], $filter, 96 qw[type ^jabber$ and room], "^\Q$room\E\$"); 97 } 82 98 return $filter; 83 99 } elsif ($self->login ne 'none') { -
perl/modules/Jabber/lib/BarnOwl/Module/Jabber.pm
r8789410 r2f25537 285 285 { 286 286 summary => "Send a Jabber Message", 287 usage => "jwrite <jid> [-t <thread>] [-s <subject>] [-a <account>] "287 usage => "jwrite <jid> [-t <thread>] [-s <subject>] [-a <account>] [-m <message>]" 288 288 } 289 289 ); … … 308 308 description => "jmuc sends Jabber commands related to MUC.\n\n" 309 309 . "The following commands are available\n\n" 310 . "join <muc> Join a MUC.\n\n" 310 . "join <muc>[/<nick>]\n" 311 . " Join a MUC (with a given nickname, or otherwise your JID).\n\n" 311 312 . "part <muc> Part a MUC.\n" 312 313 . " The MUC is taken from the current message if not supplied.\n\n" … … 377 378 my $cjidStr = $conn->baseJIDExists($jidStr); 378 379 if ($cjidStr) { 379 BarnOwl::error("Already logged in as $cjidStr."); 380 return; 380 die("Already logged in as $cjidStr.\n"); 381 381 } 382 382 } … … 387 387 388 388 if ( !$uid || !$componentname ) { 389 BarnOwl::error("usage: $cmd JID"); 390 return; 389 die("usage: $cmd JID\n"); 391 390 } 392 391 393 392 if ( $conn->jidActive($jidStr) ) { 394 BarnOwl::error("Already logged in as $jidStr."); 395 return; 393 die("Already logged in as $jidStr.\n"); 396 394 } elsif ($conn->jidExists($jidStr)) { 397 395 return $conn->tryReconnect($jidStr, 1); … … 526 524 sub cmd_jlist { 527 525 if ( !( scalar $conn->getJIDs() ) ) { 528 BarnOwl::error("You are not logged in to Jabber."); 529 return; 526 die("You are not logged in to Jabber.\n"); 530 527 } 531 528 BarnOwl::popless_ztext( onGetBuddyList() ); … … 534 531 sub cmd_jwrite { 535 532 if ( !$conn->connected() ) { 536 BarnOwl::error("You are not logged in to Jabber."); 537 return; 533 die("You are not logged in to Jabber.\n"); 538 534 } 539 535 … … 543 539 my $jwrite_thread = ""; 544 540 my $jwrite_subject = ""; 541 my $jwrite_body; 545 542 my ($to, $from); 546 543 my $jwrite_type = "chat"; … … 554 551 'subject=s' => \$jwrite_subject, 555 552 'account=s' => \$from, 556 'id=s' => \$jwrite_sid, 553 'id=s' => \$jwrite_sid, 554 'message=s' => \$jwrite_body, 557 555 ) or die("Usage: jwrite <jid> [-t <thread>] [-s <subject>] [-a <account>]\n"); 558 556 $jwrite_type = 'groupchat' if $gc; 559 557 560 558 if ( scalar @ARGV != 1 ) { 561 BarnOwl::error( 562 "Usage: jwrite <jid> [-t <thread>] [-s <subject>] [-a <account>]"); 563 return; 559 die("Usage: jwrite <jid> [-t <thread>] [-s <subject>] [-a <account>]\n"); 564 560 } 565 561 else { … … 570 566 571 567 unless(scalar @candidates) { 572 die("Unable to resolve JID $to ");568 die("Unable to resolve JID $to\n"); 573 569 } 574 570 … … 577 573 unless(scalar @candidates) { 578 574 if(!$from) { 579 die("You must specify an account with -a ");575 die("You must specify an account with -a\n"); 580 576 } else { 581 die("Unable to resolve account $from ");577 die("Unable to resolve account $from\n"); 582 578 } 583 579 } … … 594 590 type => $jwrite_type 595 591 }; 592 593 if (defined($jwrite_body)) { 594 process_owl_jwrite($jwrite_body); 595 return; 596 } 596 597 597 598 if(scalar @candidates > 1) { … … 631 632 my $func = $jmuc_commands{$cmd}; 632 633 if ( !$func ) { 633 BarnOwl::error("jmuc: Unknown command: $cmd"); 634 return; 634 die("jmuc: Unknown command: $cmd\n"); 635 635 } 636 636 … … 654 654 } 655 655 else { 656 BarnOwl::error('You must specify an account with -a <jid>');656 die("You must specify an account with -a <jid>\n"); 657 657 } 658 658 return $func->( $jid, $muc, @ARGV ); … … 667 667 668 668 $muc = shift @ARGV 669 or die("Usage: jmuc join <muc> [-p <password>] [-a <account>] ");669 or die("Usage: jmuc join <muc> [-p <password>] [-a <account>]\n"); 670 670 671 671 die("Error: Must specify a fully-qualified MUC name (e.g. barnowl\@conference.mit.edu)\n") … … 680 680 MaxChars => 0 681 681 }); 682 $completion_jids{$muc } = 1;682 $completion_jids{$muc->GetJID('base')} = 1; 683 683 return; 684 684 } … … 688 688 689 689 $muc = shift @args if scalar @args; 690 die("Usage: jmuc part [<muc>] [-a <account>] ") unless $muc;690 die("Usage: jmuc part [<muc>] [-a <account>]\n") unless $muc; 691 691 692 692 if($conn->getConnectionFromJID($jid)->MUCLeave(JID => $muc)) { 693 693 queue_admin_msg("$jid has left $muc."); 694 694 } else { 695 die("Error: Not joined to $muc ");695 die("Error: Not joined to $muc\n"); 696 696 } 697 697 } … … 703 703 $muc = shift @args if scalar @args; 704 704 705 die( 'Usage: jmuc invite <jid> [<muc>] [-a <account>]')705 die("Usage: jmuc invite <jid> [<muc>] [-a <account>]\n") 706 706 unless $muc && $invite_jid; 707 707 … … 718 718 my ( $jid, $muc, @args ) = @_; 719 719 $muc = shift @args if scalar @args; 720 die("Usage: jmuc configure [<muc>] ") unless $muc;720 die("Usage: jmuc configure [<muc>]\n") unless $muc; 721 721 my $iq = Net::Jabber::IQ->new(); 722 722 $iq->SetTo($muc); … … 759 759 760 760 $muc = shift @args if scalar @args; 761 die("Usage: jmuc presence [<muc>] ") unless $muc;761 die("Usage: jmuc presence [<muc>]\n") unless $muc; 762 762 763 763 if ($muc eq '-a') { … … 774 774 else { 775 775 my $m = $conn->getConnectionFromJID($jid)->FindMUC(jid => $muc); 776 die("No such muc: $muc ") unless $m;776 die("No such muc: $muc\n") unless $m; 777 777 BarnOwl::popless_ztext(jmuc_presence_single($m)); 778 778 } … … 801 801 my $func = $jroster_commands{$cmd}; 802 802 if ( !$func ) { 803 BarnOwl::error("jroster: Unknown command: $cmd"); 804 return; 803 die("jroster: Unknown command: $cmd\n"); 805 804 } 806 805 … … 825 824 } 826 825 else { 827 BarnOwl::error('You must specify an account with -a <jid>');826 die("You must specify an account with -a <jid>\n"); 828 827 } 829 828 return $func->( $jid, $name, \@groups, $purgeGroups, @ARGV ); … … 849 848 } 850 849 else { 851 BarnOwl::error('You must specify an account with -a <jid>');850 die("You must specify an account with -a <jid>\n"); 852 851 } 853 852 … … 1234 1233 $completion_jids{$room} = 1; 1235 1234 1235 my $muc; 1236 if ($dir eq 'in') { 1237 my $connection = $conn->getConnectionFromSid($props{sid}); 1238 $muc = $connection->FindMUC(jid => $from); 1239 } else { 1240 my $connection = $conn->getConnectionFromJID($props{from}); 1241 $muc = $connection->FindMUC(jid => $to); 1242 } 1243 $props{from} = $muc->GetFullJID($from) || $props{from}; 1236 1244 $props{sender} = $nick || $room; 1237 1245 $props{recipient} = $room; … … 1331 1339 return $givenJIDStr if ($conn->jidExists($givenJIDStr) ); 1332 1340 return resolveConnectedJID($givenJID->GetJID('base')) if $loose; 1333 die("Invalid account: $givenJIDStr ");1341 die("Invalid account: $givenJIDStr\n"); 1334 1342 } 1335 1343 … … 1384 1392 # Not one of ours. 1385 1393 else { 1386 die("Invalid account: $givenJIDStr ");1394 die("Invalid account: $givenJIDStr\n"); 1387 1395 } 1388 1396 … … 1430 1438 if($from) { 1431 1439 $from_jid = resolveConnectedJID($from, 1); 1432 die("Unable to resolve account $from ") unless $from_jid;1440 die("Unable to resolve account $from\n") unless $from_jid; 1433 1441 $to_jid = resolveDestJID($to, $from_jid); 1434 1442 push @matches, [$from_jid, $to_jid] if $to_jid; -
perl/modules/Makefile.am
r636de2a r1fd469d4 1 MODULES = Jabber IRC WordWrap 1 MODULES = Jabber IRC WordWrap Twitter 2 2 3 3 EXTRA_DIST = $(MODULES:=/Makefile.PL) $(MODULES:=/inc) $(MODULES:=/lib) -
perlconfig.c
r5aa33fd r5aa33fd 584 584 } 585 585 586 void owl_perlconfig_mainloop(owl_timer *t, void *data)587 {588 dSP;589 if (!owl_perlconfig_is_function("BarnOwl::Hooks::_mainloop_hook"))590 return;591 PUSHMARK(SP) ;592 call_pv("BarnOwl::Hooks::_mainloop_hook", G_DISCARD|G_EVAL);593 if(SvTRUE(ERRSV)) {594 owl_function_error("%s", SvPV_nolen(ERRSV));595 }596 return;597 }598 599 586 void owl_perlconfig_io_dispatch(const owl_io_dispatch *d, void *data) 600 587 { -
popexec.c
r125fd21 r07b59ea 27 27 28 28 owl_popwin_up(pw); 29 owl_global_push_context(&g, OWL_CTX_POPLESS, v, "popless"); 30 owl_viewwin_init_text(v, owl_popwin_get_curswin(pw), 31 owl_popwin_get_lines(pw), owl_popwin_get_cols(pw), 32 ""); 33 owl_viewwin_redisplay(v); 34 owl_global_set_needrefresh(&g); 29 owl_global_push_context(&g, OWL_CTX_POPLESS, v, "popless", NULL); 30 owl_viewwin_init_text(v, owl_popwin_get_content(pw), ""); 35 31 owl_viewwin_set_onclose_hook(v, owl_popexec_viewwin_onclose, pe); 36 32 pe->refcount++; … … 111 107 if (pe->winactive) { 112 108 owl_viewwin_append_text(pe->vwin, "\n"); 113 owl_viewwin_redisplay(pe->vwin);114 owl_global_set_needrefresh(&g);115 109 } 116 110 owl_select_remove_io_dispatch(d); … … 139 133 if (pe->winactive) { 140 134 owl_viewwin_append_text(pe->vwin, buf); 141 owl_viewwin_redisplay(pe->vwin);142 owl_global_set_needrefresh(&g);143 135 } 144 136 owl_free(buf); -
popwin.c
r0881cdd r05ca0d8 4 4 { 5 5 pw->active=0; 6 pw->lines=0;7 pw->cols=0;8 6 return(0); 9 7 } … … 11 9 int owl_popwin_up(owl_popwin *pw) 12 10 { 13 int glines, gcols, startcol, startline; 14 WINDOW *popwin, *borderwin; 11 pw->border = owl_window_new(NULL); 12 pw->content = owl_window_new(pw->border); 13 g_signal_connect(pw->border, "redraw", G_CALLBACK(owl_popwin_draw_border), 0); 14 owl_signal_connect_object(owl_window_get_screen(), "resized", G_CALLBACK(owl_popwin_size_border), pw->border, 0); 15 owl_signal_connect_object(pw->border, "resized", G_CALLBACK(owl_popwin_size_content), pw->content, 0); 15 16 16 /* calculate the size of the popwin */ 17 glines=owl_global_get_lines(&g); 18 gcols=owl_global_get_cols(&g); 17 /* bootstrap sizing */ 18 owl_popwin_size_border(owl_window_get_screen(), pw->border); 19 19 20 pw->lines = owl_util_min(glines,24)*3/4 + owl_util_max(glines-24,0)/2; 21 startline = (glines-pw->lines)/2; 20 owl_window_show_all(pw->border); 22 21 23 pw->cols = owl_util_min(gcols,90)*15/16 + owl_util_max(gcols-90,0)/2; 24 startcol = (gcols-pw->cols)/2; 22 pw->active=1; 23 return(0); 24 } 25 25 26 borderwin = newwin(pw->lines, pw->cols, startline, startcol); 27 pw->borderpanel = new_panel(borderwin); 28 popwin = newwin(pw->lines-2, pw->cols-2, startline+1, startcol+1); 29 pw->poppanel = new_panel(popwin); 26 void owl_popwin_size_border(owl_window *parent, void *user_data) 27 { 28 int lines, cols, startline, startcol; 29 int glines, gcols; 30 owl_window *border = user_data; 30 31 31 werase(popwin); 32 werase(borderwin); 32 owl_window_get_position(parent, &glines, &gcols, 0, 0); 33 34 lines = owl_util_min(glines,24)*3/4 + owl_util_max(glines-24,0)/2; 35 startline = (glines-lines)/2; 36 cols = owl_util_min(gcols,90)*15/16 + owl_util_max(gcols-90,0)/2; 37 startcol = (gcols-cols)/2; 38 39 owl_window_set_position(border, lines, cols, startline, startcol); 40 } 41 42 void owl_popwin_size_content(owl_window *parent, void *user_data) 43 { 44 int lines, cols; 45 owl_window *content = user_data; 46 owl_window_get_position(parent, &lines, &cols, 0, 0); 47 owl_window_set_position(content, lines-2, cols-2, 1, 1); 48 } 49 50 void owl_popwin_draw_border(owl_window *w, WINDOW *borderwin, void *user_data) 51 { 52 int lines, cols; 53 owl_window_get_position(w, &lines, &cols, 0, 0); 33 54 if (owl_global_is_fancylines(&g)) { 34 55 box(borderwin, 0, 0); … … 37 58 wmove(borderwin, 0, 0); 38 59 waddch(borderwin, '+'); 39 wmove(borderwin, pw->lines-1, 0);60 wmove(borderwin, lines-1, 0); 40 61 waddch(borderwin, '+'); 41 wmove(borderwin, pw->lines-1, pw->cols-1);62 wmove(borderwin, lines-1, cols-1); 42 63 waddch(borderwin, '+'); 43 wmove(borderwin, 0, pw->cols-1);64 wmove(borderwin, 0, cols-1); 44 65 waddch(borderwin, '+'); 45 66 } 46 47 owl_global_set_needrefresh(&g);48 pw->active=1;49 return(0);50 67 } 51 68 52 69 int owl_popwin_close(owl_popwin *pw) 53 70 { 54 WINDOW *popwin, *borderwin; 71 owl_window_unlink(pw->border); 72 g_object_unref(pw->border); 73 g_object_unref(pw->content); 55 74 56 popwin = panel_window(pw->poppanel); 57 borderwin = panel_window(pw->borderpanel); 58 59 del_panel(pw->poppanel); 60 del_panel(pw->borderpanel); 61 delwin(popwin); 62 delwin(borderwin); 63 75 pw->border = 0; 76 pw->content = 0; 64 77 pw->active=0; 65 owl_global_set_needrefresh(&g);66 78 return(0); 67 79 } … … 72 84 } 73 85 74 WINDOW *owl_popwin_get_curswin(const owl_popwin *pw)86 owl_window *owl_popwin_get_content(const owl_popwin *pw) 75 87 { 76 return p anel_window(pw->poppanel);88 return pw->content; 77 89 } 78 79 int owl_popwin_get_lines(const owl_popwin *pw)80 {81 return(pw->lines-2);82 }83 84 int owl_popwin_get_cols(const owl_popwin *pw)85 {86 return(pw->cols-2);87 } -
stubgen.pl
rd7cc50b rea7daa8 12 12 my $altvarname = $2; 13 13 $altvarname = $3 if ($3); 14 my $detailname = $altvarname; 15 $detailname =~ s/[^a-zA-Z0-9]/-/g; 16 $detailname =~ s/^[^a-zA-Z]+//; 14 17 if ($vartype =~ /^BOOL/) { 15 print "void owl_global_set_${altvarname}_on(owl_global *g) {\n"; 16 print " owl_variable_set_bool_on(&g->vars, \"$varname\");\n}\n"; 17 print "void owl_global_set_${altvarname}_off(owl_global *g) {\n"; 18 print " owl_variable_set_bool_off(&g->vars, \"$varname\");\n}\n"; 19 print "int owl_global_is_$altvarname(const owl_global *g) {\n"; 20 print " return owl_variable_get_bool(&g->vars, \"$varname\");\n}\n"; 18 print <<EOT; 19 void owl_global_set_${altvarname}_on(owl_global *g) { 20 owl_variable_set_bool_on(&g->vars, "$altvarname"); 21 } 22 void owl_global_set_${altvarname}_off(owl_global *g) { 23 owl_variable_set_bool_off(&g->vars, "$altvarname"); 24 } 25 int owl_global_is_$altvarname(const owl_global *g) { 26 return owl_variable_get_bool(&g->vars, "$varname"); 27 } 28 EOT 21 29 } elsif ($vartype =~ /^PATH/ or $vartype =~ /^STRING/) { 22 print "void owl_global_set_$altvarname(owl_global *g, const char *text) {\n"; 23 print " owl_variable_set_string(&g->vars, \"$varname\", text);\n}\n"; 24 print "const char *owl_global_get_$altvarname(const owl_global *g) {\n"; 25 print " return owl_variable_get_string(&g->vars, \"$varname\");\n}\n"; 30 print <<EOT; 31 void owl_global_set_${altvarname}(owl_global *g, const char *text) { 32 owl_variable_set_string(&g->vars, "$altvarname", text); 33 } 34 const char *owl_global_get_$altvarname(const owl_global *g) { 35 return owl_variable_get_string(&g->vars, "$varname"); 36 } 37 EOT 26 38 } elsif ($vartype =~ /^INT/ or $vartype =~ /^ENUM/) { 27 print "void owl_global_set_$altvarname(owl_global *g, int n) {\n"; 28 print " owl_variable_set_int(&g->vars, \"$varname\", n);\n}\n"; 29 print "int owl_global_get_$altvarname(const owl_global *g) {\n"; 30 print " return owl_variable_get_int(&g->vars, \"$varname\");\n}\n"; 39 print <<EOT; 40 void owl_global_set_${altvarname}(owl_global *g, int n) { 41 owl_variable_set_int(&g->vars, "$altvarname", n); 42 } 43 int owl_global_get_$altvarname(const owl_global *g) { 44 return owl_variable_get_int(&g->vars, "$varname"); 45 } 46 EOT 31 47 } 32 48 } -
tester.c
r95414bf r95414bf 105 105 numfailures += owl_variable_regtest(); 106 106 numfailures += owl_filter_regtest(); 107 numfailures += owl_obarray_regtest();108 107 numfailures += owl_editwin_regtest(); 109 108 if (numfailures) { … … 368 367 } 369 368 370 371 int owl_obarray_regtest(void) {372 int numfailed = 0;373 const char *p,*p2;374 375 owl_obarray oa;376 owl_obarray_init(&oa);377 378 printf("# BEGIN testing owl_obarray\n");379 380 p = owl_obarray_insert(&oa, "test");381 FAIL_UNLESS("returned string is equal", p && !strcmp(p, "test"));382 p2 = owl_obarray_insert(&oa, "test");383 FAIL_UNLESS("returned string is equal", p2 && !strcmp(p2, "test"));384 FAIL_UNLESS("returned the same string", p2 && p == p2);385 386 p = owl_obarray_insert(&oa, "test2");387 FAIL_UNLESS("returned string is equal", p && !strcmp(p, "test2"));388 p2 = owl_obarray_find(&oa, "test2");389 FAIL_UNLESS("returned the same string", p2 && !strcmp(p2, "test2"));390 391 p = owl_obarray_find(&oa, "nothere");392 FAIL_UNLESS("Didn't find a string that isn't there", p == NULL);393 394 printf("# END testing owl_obarray (%d failures)\n", numfailed);395 396 return numfailed;397 }398 399 369 int owl_editwin_regtest(void) { 400 370 int numfailed = 0; -
util.c
r9a7b4f2 rc1f1e1e 8 8 #include <sys/types.h> 9 9 10 void sepbar(const char *in) 11 { 12 WINDOW *sepwin; 13 const owl_messagelist *ml; 14 const owl_view *v; 15 int x, y, i; 16 const char *foo, *appendtosepbar; 17 18 sepwin=owl_global_get_curs_sepwin(&g); 19 ml=owl_global_get_msglist(&g); 20 v=owl_global_get_current_view(&g); 21 22 werase(sepwin); 23 wattron(sepwin, A_REVERSE); 24 if (owl_global_is_fancylines(&g)) { 25 whline(sepwin, ACS_HLINE, owl_global_get_cols(&g)); 26 } else { 27 whline(sepwin, '-', owl_global_get_cols(&g)); 28 } 29 30 if (owl_global_is_sepbar_disable(&g)) { 31 getyx(sepwin, y, x); 32 wmove(sepwin, y, owl_global_get_cols(&g)-1); 33 return; 34 } 35 36 wmove(sepwin, 0, 2); 37 38 if (owl_messagelist_get_size(ml) == 0) 39 waddstr(sepwin, " (-/-) "); 40 else 41 wprintw(sepwin, " (%i/%i/%i) ", owl_global_get_curmsg(&g) + 1, 42 owl_view_get_size(v), 43 owl_messagelist_get_size(ml)); 44 45 foo=owl_view_get_filtname(v); 46 if (strcmp(foo, owl_global_get_view_home(&g))) 47 wattroff(sepwin, A_REVERSE); 48 wprintw(sepwin, " %s ", owl_view_get_filtname(v)); 49 if (strcmp(foo, owl_global_get_view_home(&g))) 50 wattron(sepwin, A_REVERSE); 51 52 if (owl_mainwin_is_curmsg_truncated(owl_global_get_mainwin(&g))) { 53 getyx(sepwin, y, x); 54 wmove(sepwin, y, x+2); 55 wattron(sepwin, A_BOLD); 56 waddstr(sepwin, " <truncated> "); 57 wattroff(sepwin, A_BOLD); 58 } 59 60 i=owl_mainwin_get_last_msg(owl_global_get_mainwin(&g)); 61 if ((i != -1) && 62 (i < owl_view_get_size(v)-1)) { 63 getyx(sepwin, y, x); 64 wmove(sepwin, y, x+2); 65 wattron(sepwin, A_BOLD); 66 waddstr(sepwin, " <more> "); 67 wattroff(sepwin, A_BOLD); 68 } 69 70 if (owl_global_get_rightshift(&g)>0) { 71 getyx(sepwin, y, x); 72 wmove(sepwin, y, x+2); 73 wprintw(sepwin, " right: %i ", owl_global_get_rightshift(&g)); 74 } 75 76 if (owl_global_is_zaway(&g) || owl_global_is_aaway(&g)) { 77 getyx(sepwin, y, x); 78 wmove(sepwin, y, x+2); 79 wattron(sepwin, A_BOLD); 80 wattroff(sepwin, A_REVERSE); 81 if (owl_global_is_zaway(&g) && owl_global_is_aaway(&g)) { 82 waddstr(sepwin, " AWAY "); 83 } else if (owl_global_is_zaway(&g)) { 84 waddstr(sepwin, " Z-AWAY "); 85 } else if (owl_global_is_aaway(&g)) { 86 waddstr(sepwin, " A-AWAY "); 87 } 88 wattron(sepwin, A_REVERSE); 89 wattroff(sepwin, A_BOLD); 90 } 91 92 if (owl_global_get_curmsg_vert_offset(&g)) { 93 getyx(sepwin, y, x); 94 wmove(sepwin, y, x+2); 95 wattron(sepwin, A_BOLD); 96 wattroff(sepwin, A_REVERSE); 97 waddstr(sepwin, " SCROLL "); 98 wattron(sepwin, A_REVERSE); 99 wattroff(sepwin, A_BOLD); 100 } 101 102 if (in) { 103 getyx(sepwin, y, x); 104 wmove(sepwin, y, x+2); 105 waddstr(sepwin, in); 106 } 107 108 appendtosepbar = owl_global_get_appendtosepbar(&g); 109 if (appendtosepbar && *appendtosepbar) { 110 getyx(sepwin, y, x); 111 wmove(sepwin, y, x+2); 112 waddstr(sepwin, " "); 113 waddstr(sepwin, owl_global_get_appendtosepbar(&g)); 114 waddstr(sepwin, " "); 115 } 116 117 getyx(sepwin, y, x); 118 wmove(sepwin, y, owl_global_get_cols(&g)-1); 119 120 wattroff(sepwin, A_BOLD); 121 wattroff(sepwin, A_REVERSE); 122 } 10 #include <glib-object.h> 123 11 124 12 char **atokenize(const char *buffer, const char *sep, int *i) … … 786 674 return buf; 787 675 } 676 677 gulong owl_dirty_window_on_signal(owl_window *w, gpointer sender, const gchar *detailed_signal) 678 { 679 return owl_signal_connect_object(sender, detailed_signal, G_CALLBACK(owl_window_dirty), w, G_CONNECT_SWAPPED); 680 } 681 682 typedef struct { /*noproto*/ 683 GObject *sender; 684 gulong signal_id; 685 } SignalData; 686 687 static void _closure_invalidated(gpointer data, GClosure *closure); 688 689 /* 690 * GObject's g_signal_connect_object has a documented bug. This function is 691 * identical except it does not leak the signal handler. 692 */ 693 gulong owl_signal_connect_object(gpointer sender, const gchar *detailed_signal, GCallback c_handler, gpointer receiver, GConnectFlags connect_flags) 694 { 695 g_return_val_if_fail (G_TYPE_CHECK_INSTANCE (sender), 0); 696 g_return_val_if_fail (detailed_signal != NULL, 0); 697 g_return_val_if_fail (c_handler != NULL, 0); 698 699 if (receiver) { 700 SignalData *sdata; 701 GClosure *closure; 702 gulong signal_id; 703 704 g_return_val_if_fail (G_IS_OBJECT (receiver), 0); 705 706 closure = ((connect_flags & G_CONNECT_SWAPPED) ? g_cclosure_new_object_swap : g_cclosure_new_object) (c_handler, receiver); 707 signal_id = g_signal_connect_closure (sender, detailed_signal, closure, connect_flags & G_CONNECT_AFTER); 708 709 /* Register the missing hooks */ 710 sdata = g_slice_new0(SignalData); 711 sdata->sender = sender; 712 sdata->signal_id = signal_id; 713 714 g_closure_add_invalidate_notifier(closure, sdata, _closure_invalidated); 715 716 return signal_id; 717 } else { 718 return g_signal_connect_data(sender, detailed_signal, c_handler, NULL, NULL, connect_flags); 719 } 720 } 721 722 /* 723 * There are three ways the signal could come to an end: 724 * 725 * 1. The user explicitly disconnects it with the returned signal_id. 726 * - In that case, the disconnection unref's the closure, causing it 727 * to first be invalidated. The handler's already disconnected, so 728 * we have no work to do. 729 * 2. The sender gets destroyed. 730 * - GObject will disconnect each signal which then goes into the above 731 * case. Our handler does no work. 732 * 3. The receiver gets destroyed. 733 * - The GClosure was created by g_cclosure_new_object_{,swap} which gets 734 * invalidated when the receiver is destroyed. We then follow through case 1 735 * again, but *this* time, the handler has not been disconnected. We then 736 * clean up ourselves. 737 * 738 * We can't actually hook into this process earlier with weakrefs as GObject 739 * will, on object dispose, first disconnect signals, then invalidate closures, 740 * and notify weakrefs last. 741 */ 742 static void _closure_invalidated(gpointer data, GClosure *closure) 743 { 744 SignalData *sdata = data; 745 if (g_signal_handler_is_connected(sdata->sender, sdata->signal_id)) { 746 g_signal_handler_disconnect(sdata->sender, sdata->signal_id); 747 } 748 g_slice_free(SignalData, sdata); 749 } 750 -
variable.c
r26ad412 r26ad412 110 110 111 111 OWLVAR_ENUM( "loggingdirection" /* %OwlVarStub */, OWL_LOGGING_DIRECTION_BOTH, 112 "specifi ces which kind of messages should be logged",112 "specifies which kind of messages should be logged", 113 113 "Can be one of 'both', 'in', or 'out'. If 'in' is\n" 114 114 "selected, only incoming messages are logged, if 'out'\n" … … 138 138 "location of users in your .anyone file. If a user is present\n" 139 139 "but sent no login message, or a user is not present that sent no\n" 140 "logout message, a pseudo login or logout message wil be created\n",140 "logout message, a pseudo login or logout message will be created\n", 141 141 NULL, owl_variable_pseudologins_set, NULL), 142 142 … … 151 151 152 152 "If non empty, any messages matching the given filter will be logged.\n" 153 "This is a completely separate mechanis im from the other logging\n"153 "This is a completely separate mechanism from the other logging\n" 154 154 "variables like logging, classlogging, loglogins, loggingdirection,\n" 155 155 "etc. If you want this variable to control all logging, make sure\n" … … 199 199 OWLVAR_PATH( "newmsgproc" /* %OwlVarStub:newmsgproc */, NULL, 200 200 "name of a program to run when new messages are present", 201 "The named program will be run when owl rece vies new.\n"201 "The named program will be run when owl receives new\n" 202 202 "messages. It will not be run again until the first\n" 203 203 "instance exits"), … … 214 214 "Called every time you start a zephyrgram without an\n" 215 215 "explicit zsig. The default setting implements the policy\n" 216 "descri pted in the documentation for the 'zsig' variable.\n"),216 "described in the documentation for the 'zsig' variable.\n"), 217 217 218 218 OWLVAR_STRING( "zsig" /* %OwlVarStub */, "", … … 298 298 "number of seconds after AIM login to ignore login messages", 299 299 "This specifies the number of seconds to wait after an\n" 300 "AIM login before allowing the rec ipt of AIM login notifications.\n"300 "AIM login before allowing the receipt of AIM login notifications.\n" 301 301 "By default this is set to 15. If you would like to view login\n" 302 302 "notifications of buddies as soon as you login, set it to 0 instead."), … … 401 401 int rv; 402 402 rv = owl_variable_int_set_default(v, newval); 403 if (0 == rv) owl_ global_set_relayout_pending(&g);403 if (0 == rv) owl_mainpanel_layout_contents(&g.mainpanel); 404 404 return(rv); 405 405 } -
viewwin.c
rfe4c786 r0b9e607 4 4 #define BOTTOM_OFFSET 1 5 5 6 static void owl_viewwin_redraw(owl_window *w, WINDOW *curswin, void *user_data); 7 6 8 /* initialize the viewwin e. 'win' is an already initialzed curses 7 9 * window that will be used by viewwin 8 10 */ 9 void owl_viewwin_init_text(owl_viewwin *v, WINDOW *win, int winlines, int wincols, const char *text)11 void owl_viewwin_init_text(owl_viewwin *v, owl_window *win, const char *text) 10 12 { 11 13 owl_fmtext_init_null(&(v->fmtext)); … … 19 21 v->topline=0; 20 22 v->rightshift=0; 21 v->winlines=winlines;22 v->wincols=wincols;23 v->curswin=win;24 23 v->onclose_hook = NULL; 24 25 owl_viewwin_set_window(v, win); 25 26 } 26 27 … … 28 29 owl_fmtext_append_normal(&(v->fmtext), text); 29 30 v->textlines=owl_fmtext_num_lines(&(v->fmtext)); 31 owl_window_dirty(v->window); 30 32 } 31 33 … … 33 35 * window that will be used by viewwin 34 36 */ 35 void owl_viewwin_init_fmtext(owl_viewwin *v, WINDOW *win, int winlines, int wincols, const owl_fmtext *fmtext)37 void owl_viewwin_init_fmtext(owl_viewwin *v, owl_window *win, const owl_fmtext *fmtext) 36 38 { 37 39 char *text; … … 46 48 v->topline=0; 47 49 v->rightshift=0; 48 v->winlines=winlines; 49 v->wincols=wincols; 50 v->curswin=win; 50 51 owl_viewwin_set_window(v, win); 51 52 } 52 53 53 void owl_viewwin_set_ curswin(owl_viewwin *v, WINDOW *w, int winlines, int wincols)54 void owl_viewwin_set_window(owl_viewwin *v, owl_window *w) 54 55 { 55 v->curswin=w; 56 v->winlines=winlines; 57 v->wincols=wincols; 56 if (v->window) { 57 g_signal_handler_disconnect(v->window, v->sig_redraw_id); 58 g_object_unref(v->window); 59 } 60 v->window = w; 61 if (w) { 62 g_object_ref(v->window); 63 v->sig_redraw_id = g_signal_connect(w, "redraw", G_CALLBACK(owl_viewwin_redraw), v); 64 } 58 65 } 59 66 … … 64 71 65 72 /* regenerate text on the curses window. */ 66 void owl_viewwin_redisplay(owl_viewwin *v)73 static void owl_viewwin_redraw(owl_window *w, WINDOW *curswin, void *user_data) 67 74 { 68 75 owl_fmtext fm1, fm2; 76 owl_viewwin *v = user_data; 77 int winlines, wincols; 69 78 70 /* avoid segfault when screen too small to create curswin */ 71 if (v->curswin == NULL) 72 return; 79 owl_window_get_position(w, &winlines, &wincols, 0, 0); 73 80 74 werase( v->curswin);75 wmove( v->curswin, 0, 0);81 werase(curswin); 82 wmove(curswin, 0, 0); 76 83 77 84 owl_fmtext_init_null(&fm1); 78 85 owl_fmtext_init_null(&fm2); 79 86 80 owl_fmtext_truncate_lines(&(v->fmtext), v->topline, v->winlines-BOTTOM_OFFSET, &fm1);81 owl_fmtext_truncate_cols(&fm1, v->rightshift, v->wincols-1+v->rightshift, &fm2);87 owl_fmtext_truncate_lines(&(v->fmtext), v->topline, winlines-BOTTOM_OFFSET, &fm1); 88 owl_fmtext_truncate_cols(&fm1, v->rightshift, wincols-1+v->rightshift, &fm2); 82 89 83 owl_fmtext_curs_waddstr_without_search(&fm2, v->curswin);90 owl_fmtext_curs_waddstr_without_search(&fm2, curswin); 84 91 85 92 /* print the message at the bottom */ 86 wmove( v->curswin, v->winlines-1, 0);87 wattrset( v->curswin, A_REVERSE);88 if (v->textlines - v->topline > v->winlines-BOTTOM_OFFSET) {89 waddstr( v->curswin, "--More-- (Space to see more, 'q' to quit)");93 wmove(curswin, winlines-1, 0); 94 wattrset(curswin, A_REVERSE); 95 if (v->textlines - v->topline > winlines-BOTTOM_OFFSET) { 96 waddstr(curswin, "--More-- (Space to see more, 'q' to quit)"); 90 97 } else { 91 waddstr( v->curswin, "--End-- (Press 'q' to quit)");98 waddstr(curswin, "--End-- (Press 'q' to quit)"); 92 99 } 93 wattroff( v->curswin, A_REVERSE);100 wattroff(curswin, A_REVERSE); 94 101 95 102 owl_fmtext_cleanup(&fm1); … … 99 106 void owl_viewwin_pagedown(owl_viewwin *v) 100 107 { 101 v->topline+=v->winlines - BOTTOM_OFFSET; 102 if ( (v->topline+v->winlines-BOTTOM_OFFSET) > v->textlines) { 103 v->topline = v->textlines - v->winlines + BOTTOM_OFFSET; 108 int winlines; 109 owl_window_get_position(v->window, &winlines, 0, 0, 0); 110 v->topline+=winlines - BOTTOM_OFFSET; 111 if ( (v->topline+winlines-BOTTOM_OFFSET) > v->textlines) { 112 v->topline = v->textlines - winlines + BOTTOM_OFFSET; 104 113 } 114 owl_window_dirty(v->window); 105 115 } 106 116 107 117 void owl_viewwin_linedown(owl_viewwin *v) 108 118 { 119 int winlines; 120 owl_window_get_position(v->window, &winlines, 0, 0, 0); 109 121 v->topline++; 110 if ( (v->topline+ v->winlines-BOTTOM_OFFSET) > v->textlines) {111 v->topline = v->textlines - v->winlines + BOTTOM_OFFSET;122 if ( (v->topline+winlines-BOTTOM_OFFSET) > v->textlines) { 123 v->topline = v->textlines - winlines + BOTTOM_OFFSET; 112 124 } 125 owl_window_dirty(v->window); 113 126 } 114 127 115 128 void owl_viewwin_pageup(owl_viewwin *v) 116 129 { 117 v->topline-=v->winlines; 130 int winlines; 131 owl_window_get_position(v->window, &winlines, 0, 0, 0); 132 v->topline-=winlines; 118 133 if (v->topline<0) v->topline=0; 134 owl_window_dirty(v->window); 119 135 } 120 136 … … 123 139 v->topline--; 124 140 if (v->topline<0) v->topline=0; 141 owl_window_dirty(v->window); 125 142 } 126 143 … … 128 145 { 129 146 v->rightshift+=n; 147 owl_window_dirty(v->window); 130 148 } 131 149 … … 134 152 v->rightshift-=n; 135 153 if (v->rightshift<0) v->rightshift=0; 154 owl_window_dirty(v->window); 136 155 } 137 156 … … 140 159 v->topline=0; 141 160 v->rightshift=0; 161 owl_window_dirty(v->window); 142 162 } 143 163 144 164 void owl_viewwin_bottom(owl_viewwin *v) 145 165 { 146 v->topline = v->textlines - v->winlines + BOTTOM_OFFSET; 166 int winlines; 167 owl_window_get_position(v->window, &winlines, 0, 0, 0); 168 v->topline = v->textlines - winlines + BOTTOM_OFFSET; 169 owl_window_dirty(v->window); 147 170 } 148 171 149 172 void owl_viewwin_cleanup(owl_viewwin *v) 150 173 { 174 owl_viewwin_set_window(v, NULL); 151 175 if (v->onclose_hook) { 152 176 v->onclose_hook(v, v->onclose_hook_data); -
zcrypt.c
r60fcd71 r3c2c7fc 88 88 89 89 cipher_pair ciphers[NCIPHER] = { 90 [CIPHER_DES] { do_encrypt_des, do_decrypt_des},91 [CIPHER_AES] { do_encrypt_aes, do_decrypt_aes},90 [CIPHER_DES] = { do_encrypt_des, do_decrypt_des}, 91 [CIPHER_AES] = { do_encrypt_aes, do_decrypt_aes}, 92 92 }; 93 93 … … 113 113 int mode = M_NONE; 114 114 115 extern int optind, opterr;116 extern char *optarg;117 115 char c; 118 116 -
zephyr.c
r8ab1f28 r8ab1f28 265 265 266 266 if (stat(subsfile, &statbuff) != 0) { 267 owl_free(subsfile); 267 268 if (error_on_nofile == 1) 268 269 return -1; … … 380 381 subsfile = owl_zephyr_dotfile(".anyone", filename); 381 382 382 if (stat(subsfile, &statbuff) == -1) 383 if (stat(subsfile, &statbuff) == -1) { 384 owl_free(subsfile); 383 385 return 0; 386 } 384 387 385 388 ZResetAuthentication(); … … 856 859 char *tmpbuff, *myuser, *to; 857 860 owl_message *mout; 861 owl_zwrite *z; 858 862 859 863 /* bail if it doesn't look like a message we should reply to. Some … … 891 895 owl_free(to); 892 896 897 z = owl_zwrite_new(tmpbuff); 898 owl_zwrite_set_message(z, owl_global_get_zaway_msg(&g)); 899 owl_zwrite_set_zsig(z, "Automated reply:"); 900 893 901 /* display the message as an admin message in the receive window */ 894 mout=owl_function_make_outgoing_zephyr( owl_global_get_zaway_msg(&g), tmpbuff, "Automated reply:");902 mout=owl_function_make_outgoing_zephyr(z); 895 903 owl_global_messagequeue_addmsg(&g, mout); 896 904 owl_free(tmpbuff); 905 owl_zwrite_delete(z); 897 906 #endif 898 907 } -
zwrite.c
rc230bc1 r7bfc613 5 5 #include "owl.h" 6 6 7 owl_zwrite *owl_zwrite_new(const char *line) 8 { 9 owl_zwrite *z = owl_malloc(sizeof *z); 10 if (owl_zwrite_create_from_line(z, line) < 0) { 11 owl_zwrite_delete(z); 12 return NULL; 13 } 14 return z; 15 } 16 7 17 int owl_zwrite_create_from_line(owl_zwrite *z, const char *line) 8 18 { … … 15 25 16 26 /* start with null entries */ 27 z->cmd=NULL; 17 28 z->realm=NULL; 18 29 z->class=NULL; … … 35 46 myargc=argc; 36 47 if (myargc && *(myargv[0])!='-') { 48 z->cmd=owl_strdup(myargv[0]); 37 49 myargc--; 38 50 myargv++; … … 187 199 } 188 200 201 /* Set the message with no post-processing*/ 202 void owl_zwrite_set_message_raw(owl_zwrite *z, const char *msg) 203 { 204 if (z->message) owl_free(z->message); 205 z->message = owl_validate_utf8(msg); 206 } 207 189 208 void owl_zwrite_set_message(owl_zwrite *z, const char *msg) 190 209 { … … 350 369 } 351 370 371 void owl_zwrite_delete(owl_zwrite *z) 372 { 373 owl_zwrite_cleanup(z); 374 owl_free(z); 375 } 376 352 377 void owl_zwrite_cleanup(owl_zwrite *z) 353 378 {
Note: See TracChangeset
for help on using the changeset viewer.