# --- ROCK-COPYRIGHT-NOTE-BEGIN --- # # This copyright note is auto-generated by ./scripts/Create-CopyPatch. # Please add additional copyright information _after_ the line containing # the ROCK-COPYRIGHT-NOTE-END tag. Otherwise it might get removed by # the ./scripts/Create-CopyPatch script. Do not edit this copyright text! # # ROCK Linux: rock-src/package/tsa/slrn/collapse_subthread.patch # ROCK Linux is Copyright (C) 1998 - 2003 Clifford Wolf # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. A copy of the GNU General Public # License can be found at Documentation/COPYING. # # Many people helped and are helping developing ROCK Linux. Please # have a look at http://www.rocklinux.org/ and the Documentation/TEAM # file for details. # # --- ROCK-COPYRIGHT-NOTE-END --- --- ./src/art.c Fri Sep 13 19:52:44 2002 +++ ./src/art.c Sat Sep 14 14:39:25 2002 @@ -4575,9 +4575,81 @@ /*}}}*/ +void slrn_uncollapse_this_subthread (Slrn_Header_Type *h, int sync_linenum) /*{{{*/ +{ + Slrn_Header_Type *child; + int back = 0; + + while ((h->parent != NULL) && (h->prev != NULL) && (h->sister == NULL)) + { + /* Special case: rightmost child has no "sister" reference, so we + * check backwards for a sister reference in the leftmost child + * (h->parent->child is guaranteed as not NULL). + */ + if (h->parent->child->sister != NULL) break; + + h = h->prev; + back++; + } + + if ((child = h->child) == NULL) return; + if (0 == (child->flags & HEADER_HIDDEN)) return; + + for_this_family (child, uncollapse_header); + + if (sync_linenum) + { + Slrn_Full_Screen_Update = 1; + Slrn_Current_Header = h; + Slrn_Header_Window.current_line = (SLscroll_Type *) h; + Slrn_Header_Window.line_num -= back; + Slrn_Header_Window.num_lines += h->num_children; + } + + _art_Threads_Collapsed = -1; +} + +/*}}}*/ + +void slrn_collapse_this_subthread (Slrn_Header_Type *h, int sync_linenum) /*{{{*/ +{ + Slrn_Header_Type *child; + int back = 0; + + while ((h->parent != NULL) && (h->prev != NULL) && (h->sister == NULL)) + { + /* Special case: rightmost child has no "sister" reference, so we + * check backwards for a sister reference in the leftmost child + * (h->parent->child is guaranteed as not NULL). + */ + if (h->parent->child->sister != NULL) break; + + h = h->prev; + back++; + } + + if ((child = h->child) == NULL) return; + if (child->flags & HEADER_HIDDEN) return; + + for_this_family (child, collapse_header); + + if (sync_linenum) + { + Slrn_Full_Screen_Update = 1; + Slrn_Current_Header = h; + Slrn_Header_Window.current_line = (SLscroll_Type *) h; + Slrn_Header_Window.line_num -= back; + Slrn_Header_Window.num_lines -= h->num_children; + } + + _art_Threads_Collapsed = -1; /* uncertain */ +} + +/*}}}*/ + static void toggle_collapse_threads (void) /*{{{*/ { - if (Slrn_Prefix_Arg_Ptr != NULL) + if ((Slrn_Prefix_Arg_Ptr != NULL) && (*Slrn_Prefix_Arg_Ptr == 1)) { if (_art_Threads_Collapsed == 1) { @@ -4586,6 +4658,15 @@ else slrn_collapse_threads (0); Slrn_Prefix_Arg_Ptr = NULL; } + else if ((Slrn_Prefix_Arg_Ptr != NULL) && (*Slrn_Prefix_Arg_Ptr == 2)) + { + if (0 == slrn_is_subthread_collapsed (Slrn_Current_Header)) + slrn_collapse_this_subthread (Slrn_Current_Header, 0); + else + slrn_uncollapse_this_subthread (Slrn_Current_Header, 0); + + find_non_hidden_header (); + } else { if (0 == slrn_is_thread_collapsed (Slrn_Current_Header)) @@ -4610,6 +4691,13 @@ { if (h == NULL) return 1; while (h->parent != NULL) h = h->parent; + if (h->child == NULL) return 0; + return (h->child->flags & HEADER_HIDDEN); +} + +int slrn_is_subthread_collapsed (Slrn_Header_Type *h) +{ + if (h == NULL) return 1; if (h->child == NULL) return 0; return (h->child->flags & HEADER_HIDDEN); } diff -ur slrn/src/art.h slrn.subthreads/src/art.h --- slrn/src/art.h Fri Sep 13 19:52:44 2002 +++ slrn.subthreads/src/art.h Fri Sep 13 19:54:52 2002 @@ -226,6 +226,7 @@ extern void slrn_uncollapse_this_thread (Slrn_Header_Type *, int); extern unsigned int slrn_thread_size (Slrn_Header_Type *); extern int slrn_is_thread_collapsed (Slrn_Header_Type *); +extern int slrn_is_subthread_collapsed (Slrn_Header_Type *); extern int slrn_next_unread_header (void); extern int slrn_goto_num_tagged_header (int *); diff -ur slrn/src/help.c slrn.subthreads/src/help.c --- slrn/src/help.c Fri Sep 13 19:52:44 2002 +++ slrn.subthreads/src/help.c Fri Sep 13 19:54:52 2002 @@ -135,6 +135,7 @@ N_("Header window commands:"), N_(" ESC t Collapse / Uncollapse thread."), N_(" ESC 1 ESC t Collapse / Uncollapse all threads."), + N_(" ESC 2 ESC t Collapse / Uncollapse current sub-thread."), N_(" ESC a Toggle between header display formats."), N_(" ESC s Select threading and sorting method."), N_("Miscellaneous actions:"), diff -ur slrn/src/interp.c slrn.subthreads/src/interp.c --- slrn/src/interp.c Fri Sep 13 19:52:45 2002 +++ slrn.subthreads/src/interp.c Fri Sep 13 19:54:52 2002 @@ -983,6 +983,18 @@ slrn_uncollapse_this_thread (Slrn_Current_Header, 1); } +static void collapse_subthread (void) +{ + if (0 == check_article_mode()) + slrn_collapse_this_subthread (Slrn_Current_Header, 1); +} + +static void uncollapse_subthread (void) +{ + if (0 == check_article_mode()) + slrn_uncollapse_this_subthread (Slrn_Current_Header, 1); +} + static int thread_size (void) { if (check_article_mode ()) return -1; @@ -1001,6 +1013,12 @@ return slrn_is_thread_collapsed (Slrn_Current_Header); } +static int is_subthread_collapsed (void) +{ + if (check_article_mode ()) return -1; + return slrn_is_subthread_collapsed (Slrn_Current_Header); +} + static int header_down (int *num) /*{{{*/ { if ((-1 == check_article_mode ()) @@ -1429,6 +1447,7 @@ MAKE_INTRINSIC_S("call", slrn_call_command, SLANG_VOID_TYPE), MAKE_INTRINSIC_0("collapse_thread", collapse_thread, SLANG_VOID_TYPE), MAKE_INTRINSIC_0("collapse_threads", collapse_threads, SLANG_VOID_TYPE), + MAKE_INTRINSIC_0("collapse_subthread", collapse_subthread, SLANG_VOID_TYPE), MAKE_INTRINSIC_0("current_newsgroup", current_group_name, SLANG_STRING_TYPE), MAKE_INTRINSIC_S("datestring_to_unixtime", slrn_date_to_order_parm, SLANG_INT_TYPE), MAKE_INTRINSIC_SSS("definekey", definekey, SLANG_VOID_TYPE), @@ -1464,6 +1483,7 @@ MAKE_INTRINSIC_0("is_article_window_zoomed", slrn_is_article_win_zoomed, SLANG_INT_TYPE), MAKE_INTRINSIC_0("is_group_mode", is_group_mode, SLANG_INT_TYPE), MAKE_INTRINSIC_0("is_thread_collapsed", is_thread_collapsed, SLANG_INT_TYPE), + MAKE_INTRINSIC_0("is_subthread_collapsed", is_subthread_collapsed, SLANG_INT_TYPE), MAKE_INTRINSIC_S("make_home_filename", make_home_filename, SLANG_VOID_TYPE), MAKE_INTRINSIC_0("next_tagged_header", slrn_next_tagged_header, SLANG_INT_TYPE), MAKE_INTRINSIC_S("pipe_article", pipe_article_cmd, SLANG_VOID_TYPE), @@ -1518,6 +1538,7 @@ MAKE_INTRINSIC_S("tt_send", tt_send, SLANG_VOID_TYPE), MAKE_INTRINSIC_0("uncollapse_thread", uncollapse_thread, SLANG_VOID_TYPE), MAKE_INTRINSIC_0("uncollapse_threads", uncollapse_threads, SLANG_VOID_TYPE), + MAKE_INTRINSIC_0("uncollapse_subthread", uncollapse_subthread, SLANG_VOID_TYPE), MAKE_INTRINSIC_SS("undefinekey", undefinekey, SLANG_VOID_TYPE), MAKE_INTRINSIC_I("ungetkey", ungetkey, SLANG_VOID_TYPE), MAKE_INTRINSIC_SS("unregister_hook", slrn_unregister_hook_by_name, SLANG_INT_TYPE),