diff options
| author | erdgeist <> | 2004-01-28 13:31:51 +0000 |
|---|---|---|
| committer | erdgeist <> | 2004-01-28 13:31:51 +0000 |
| commit | b64fc98d48fd5c9831ee2e0fb12d92a548c4bd40 (patch) | |
| tree | 402fed3a94bd1692695509e45d25f6b6932b2b75 /vchat-ui.c | |
| parent | 125923fecd991e0ca24ac601b5882f3661f711c4 (diff) | |
Did some documentation
Diffstat (limited to 'vchat-ui.c')
| -rwxr-xr-x | vchat-ui.c | 101 |
1 files changed, 86 insertions, 15 deletions
| @@ -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 */ | ||
| 784 | void | 785 | void |
| 785 | resize (int signal) | 786 | resize (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 | */ | ||
| 915 | static int | 968 | static int |
| 916 | analyzefilters( void ) { | 969 | analyzefilters( 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 | } |
