summaryrefslogtreecommitdiff
path: root/vchat-ui.c
diff options
context:
space:
mode:
Diffstat (limited to 'vchat-ui.c')
-rwxr-xr-xvchat-ui.c101
1 files changed, 86 insertions, 15 deletions
diff --git a/vchat-ui.c b/vchat-ui.c
index b37f532..03c7dd6 100755
--- a/vchat-ui.c
+++ b/vchat-ui.c
@@ -780,21 +780,30 @@ redraw (void)
780 resize(0); 780 resize(0);
781} 781}
782 782
783/* resize display on SIGWINCH */ 783/* resize display on SIGWINCH
784 Nowadays used as our main redraw trigger engine */
784void 785void
785resize (int signal) 786resize (int signal)
786{ 787{
787 int xsize,ysize,topicheight=topic?1:0; 788 int xsize,ysize,topicheight=topic?1:0;
788 //errmsg ("! SIGWINCH raised without code for it, hope you didn't make it smaller ;)"); 789
789 //endwin();
790 ttgtsz(&xsize,&ysize); 790 ttgtsz(&xsize,&ysize);
791 resizeterm(ysize,xsize); 791 resizeterm(ysize,xsize);
792 //refresh(); 792
793 /* store screen-dimensions to local functions */ 793 /* store screen-dimensions to local functions */
794 getmaxyx (stdscr, screensy, screensx); 794 getmaxyx (stdscr, screensy, screensx);
795 795
796 if (!privheight_desired) privheight_desired = getintoption(CF_PRIVHEIGHT); 796 /* desired height of PM window is user controllable,
797 if ( privheight_desired > screensy - 5) privheight = screensy - 5; else privheight = privheight_desired; 797 actual size depends on space available on screen */
798 if (!privheight_desired)
799 privheight_desired = getintoption(CF_PRIVHEIGHT);
800
801 /* Leave at least 5 lines for input, console and
802 pubchannel */
803 if ( privheight_desired > screensy - 5)
804 privheight = screensy - 5;
805 else
806 privheight = privheight_desired;
798 807
799 /* check dimensions or bump user */ 808 /* check dimensions or bump user */
800 if (screensy - privheight < 4) 809 if (screensy - privheight < 4)
@@ -810,31 +819,68 @@ resize (int signal)
810 cleanup (0); 819 cleanup (0);
811 } 820 }
812 821
822 /*****
823 * Arrange windows on screen
824 *****/
825
826 /* console and input are always there and always 1 line tall */
813 wresize(console,1,screensx); 827 wresize(console,1,screensx);
814 wresize(input,1,screensx); 828 wresize(input,1,screensx);
829
830 /* If we got a private window and it is not hidden, set its size */
815 if (private && !privwinhidden) 831 if (private && !privwinhidden)
816 wresize(private,privheight,screensx); 832 wresize(private,privheight,screensx);
833
834 /* If oldschool vchat is not enabled, we have a topic line */
817 if( topic ) 835 if( topic )
818 wresize(topic,1,screensx); 836 wresize(topic,1,screensx);
819 wresize(channel, privwinhidden ? screensy - ( topicheight + 2 ) : screensy - (privheight + ( topicheight + 2 )), screensx);
820 837
838 /* public channel is always their and its height depends on:
839 * existence and visibility of priv window
840 * existence of a topic line (oldschool vchat style)
841 */
842 wresize(channel, ( !private || privwinhidden ) ? screensy - ( topicheight + 2 ) : screensy - (privheight + ( topicheight + 2 )), screensx);
843
844 /* Console and input alway take bottommost lines */
821 mvwin(console,screensy-2,0); 845 mvwin(console,screensy-2,0);
822 mvwin(input,screensy-1,0); 846 mvwin(input,screensy-1,0);
847
848 /* Private window always is top left */
823 if(private && !privwinhidden) 849 if(private && !privwinhidden)
824 mvwin(private,0,0); 850 mvwin(private,0,0);
851
852 /* Topic window may not exist without priv window, so it is
853 safe to assume sane values for privwinhidden and privheight */
825 if( topic ) 854 if( topic )
826 mvwin(topic,privwinhidden ? 0 : privheight, 0); 855 mvwin(topic,privwinhidden ? 0 : privheight, 0);
827 mvwin(channel,privwinhidden ? topicheight : privheight + topicheight, 0);
828 856
857 /* chan window starts below private window and topic line */
858 mvwin(channel, ( !private || privwinhidden ) ? topicheight : privheight + topicheight, 0);
859
860 /*******
861 * Now actual redraw starts, note, that we only fill
862 * curses *WINDOW* buffers, changes reflect on screen
863 * only, after they've been drawn to curses virtual
864 * screen buffers by wnoutrefresh and this offscreen
865 * buffer gets painted to terminal. This is triggered
866 * by consoleline(), traditionally last window to be
867 * drawn
868 ******/
869
870 /* pub channel is always there, paint scrollback buffers */
829 drawwin(channel, sb_pub); 871 drawwin(channel, sb_pub);
872 /* if priv exists and is visible, paint scrollback buffers */
830 if(private && !privwinhidden ) 873 if(private && !privwinhidden )
831 drawwin(private, sb_priv); 874 drawwin(private, sb_priv);
875 /* Send window's contents to curses virtual buffers */
832 wnoutrefresh(channel); 876 wnoutrefresh(channel);
833 if(private && !privwinhidden ) 877 if(private && !privwinhidden )
834 wnoutrefresh(private); 878 wnoutrefresh(private);
835 879
880 /* Resize and draw our message window, render topic and
881 console line */
836 if(outputshown) resize_output(); 882 if(outputshown) resize_output();
837 topicline(NULL); 883 if(topic) topicline(NULL);
838 consoleline(NULL); 884 consoleline(NULL);
839 if(loggedin) vciredraw(); 885 if(loggedin) vciredraw();
840} 886}
@@ -912,14 +958,31 @@ getsbeheight (struct sb_entry *entry, const int xwidth, int needstime )
912 958
913} 959}
914 960
961/* Check, which kind of filter we have to apply:
962 white or black listing. As white listing always
963 superseeds black listing, a single white listing
964 rule makes the whole filtering type 1.
965 If no, or only colouring rules have been found,
966 no line filtering applies.
967*/
915static int 968static int
916analyzefilters( void ) { 969analyzefilters( void ) {
917 filt *filters = filterlist; 970 filt *filters = filterlist;
918 int type = 0; 971 int type = 0;
919 972
973 /* Analyzefilters is only being called
974 after filter list has changed. This
975 also reflects in resetting the scroll
976 offset */
920 sb_pub->scroll = sb_pub->count; 977 sb_pub->scroll = sb_pub->count;
921 sb_priv->scroll = sb_priv->count; 978 sb_priv->scroll = sb_priv->count;
922 979
980 /* To avoid filtering the same line for
981 identical filter sets, we keep a per
982 line indicator, which ruleset we
983 tested the line against. This Stamp
984 is updated for each change to the
985 filter list */
923 if( ++currentstamp == 0x3fff ) currentstamp = 1; 986 if( ++currentstamp == 0x3fff ) currentstamp = 1;
924 987
925 while( (type!=1) && filters ) { 988 while( (type!=1) && filters ) {
@@ -969,12 +1032,20 @@ drawwin (WINDOW *win, struct sb_data *sb )
969 } 1032 }
970 } else { 1033 } else {
971 while( now && (sumlines <= win->_maxy )) { 1034 while( now && (sumlines <= win->_maxy )) {
972 if ( (now->stamp != currentstamp) && 1035
973 ( (now->stamp == (currentstamp | (1<<15))) || testfilter( now ) ) 1036 /* If stamp matches exactly, line has been filtered out, since top
974 ) 1037 bit off means hidden */
975 { 1038 if( now->stamp != currentstamp) {
976 sumlines += getsbeheight( now, win->_maxx, ((win == channel)||(win == private)) && usetime ); 1039
977 vis[ sumbuffers++ ] = now; 1040 /* If stamp matches and has top bit set, it has been identified
1041 positively. Else stamp does not match and line has to be
1042 tested against filters, which updates stamp. */
1043 if( (now->stamp == (currentstamp | 0x8000) ) || testfilter( now ))
1044 {
1045 sumlines += getsbeheight( now, win->_maxx, ((win == channel)||(win == private)) && usetime );
1046 vis[ sumbuffers++ ] = now;
1047 }
1048
978 } 1049 }
979 tmp = now; now = (struct sb_entry*)((unsigned long)now->link ^ (unsigned long)prev); prev = tmp; 1050 tmp = now; now = (struct sb_entry*)((unsigned long)now->link ^ (unsigned long)prev); prev = tmp;
980 } 1051 }