comparison mcabber/src/screen.c @ 713:b5aa7b7afee8

Update status lines
author Mikael Berthe <mikael@lilotux.net>
date Sat, 04 Mar 2006 18:55:54 +0100
parents e1639629c87b
children 4bcd48f6ca5f
comparison
equal deleted inserted replaced
712:e1639629c87b 713:b5aa7b7afee8
523 roster_msg_setflag(winId, TRUE); 523 roster_msg_setflag(winId, TRUE);
524 update_roster = TRUE; 524 update_roster = TRUE;
525 } 525 }
526 } 526 }
527 527
528 // scr_UpdateMainStatus()
529 // Redraw the main (bottom) status line.
530 void scr_UpdateMainStatus(void)
531 {
532 const char *sm = jb_getstatusmsg();
533
534 werase(mainstatusWnd);
535 mvwprintw(mainstatusWnd, 0, 1,
536 "[%c] %s", imstatus2char[jb_getstatus()], (sm ? sm : ""));
537 top_panel(inputPanel);
538 update_panels();
539 doupdate();
540 }
541
528 // scr_DrawMainWindow() 542 // scr_DrawMainWindow()
529 // Set fullinit to TRUE to also create panels. Set it to FALSE for a resize. 543 // Set fullinit to TRUE to also create panels. Set it to FALSE for a resize.
530 // 544 //
531 // I think it could be improved a _lot_ but I'm really not an ncurses 545 // I think it could be improved a _lot_ but I'm really not an ncurses
532 // expert... :-\ Mikael. 546 // expert... :-\ Mikael.
639 replace_panel(chatstatusPanel, chatstatusWnd); 653 replace_panel(chatstatusPanel, chatstatusWnd);
640 replace_panel(mainstatusPanel, mainstatusWnd); 654 replace_panel(mainstatusPanel, mainstatusWnd);
641 replace_panel(inputPanel, inputWnd); 655 replace_panel(inputPanel, inputWnd);
642 } 656 }
643 657
658 scr_UpdateMainStatus();
644 // We'll need to redraw the roster 659 // We'll need to redraw the roster
645 update_roster = TRUE; 660 update_roster = TRUE;
646 return; 661 return;
647 } 662 }
648 663
699 // Refresh current buddy window 714 // Refresh current buddy window
700 if (chatmode) 715 if (chatmode)
701 scr_ShowBuddyWindow(); 716 scr_ShowBuddyWindow();
702 } 717 }
703 718
719 // update_chat_status_window()
720 // Redraw the buddy status bar.
721 static void update_chat_status_window(void)
722 {
723 unsigned short btype, isgrp, ismuc;
724 const char *fullname;
725 const char *msg = NULL;
726 char status;
727 char *buf;
728
729 btype = buddy_gettype(BUDDATA(current_buddy));
730
731 isgrp = btype & ROSTER_TYPE_GROUP;
732 ismuc = btype & ROSTER_TYPE_ROOM;
733
734 // Clear the line
735 werase(chatstatusWnd);
736
737 if (isgrp) return;
738
739 status = '?';
740
741 if (ismuc) {
742 if (buddy_getinsideroom(BUDDATA(current_buddy)))
743 status = 'C';
744 else
745 status = 'x';
746 } else if (jb_getstatus() != offline) {
747 enum imstatus budstate;
748 budstate = buddy_getstatus(BUDDATA(current_buddy), NULL);
749 if (budstate >= 0 && budstate < imstatus_size)
750 status = imstatus2char[budstate];
751 }
752
753 fullname = buddy_getname(BUDDATA(current_buddy));
754
755 // No status message for groups & MUC rooms
756 if (!isgrp && !ismuc) {
757 GSList *resources = buddy_getresources(BUDDATA(current_buddy));
758 if (resources)
759 msg = buddy_getstatusmsg(BUDDATA(current_buddy), resources->data);
760 }
761 if (!msg)
762 msg = "";
763
764 buf = g_strdup_printf("[%c] Buddy: %s -- %s", status, fullname, msg);
765 replace_nl_with_dots(buf);
766 mvwprintw(chatstatusWnd, 0, 1, "%s", buf);
767 g_free(buf);
768 }
769
704 // scr_DrawRoster() 770 // scr_DrawRoster()
705 // Display the buddylist (not really the roster) on the screen 771 // Display the buddylist (not really the roster) on the screen
706 void scr_DrawRoster(void) 772 void scr_DrawRoster(void)
707 { 773 {
708 static guint offset = 0; 774 static guint offset = 0;
709 char *name, *rline; 775 char *name, *rline;
710 int maxx, maxy; 776 int maxx, maxy;
711 GList *buddy; 777 GList *buddy;
712 int i, n; 778 int i, n;
713 int rOffset; 779 int rOffset;
780 int cursor_backup;
781 char status, pending;
714 enum imstatus currentstatus = jb_getstatus(); 782 enum imstatus currentstatus = jb_getstatus();
715 783
716 // We can reset update_roster 784 // We can reset update_roster
717 update_roster = FALSE; 785 update_roster = FALSE;
718 786
719 getmaxyx(rosterWnd, maxy, maxx); 787 getmaxyx(rosterWnd, maxy, maxx);
720 maxx--; // Last char is for vertical border 788 maxx--; // Last char is for vertical border
789
790 cursor_backup = curs_set(0);
721 791
722 // Cleanup of roster window 792 // Cleanup of roster window
723 werase(rosterWnd); 793 werase(rosterWnd);
724 794
725 if (Roster_Width) { 795 if (Roster_Width) {
729 mvwaddch(rosterWnd, i, Roster_Width-1, ACS_VLINE); 799 mvwaddch(rosterWnd, i, Roster_Width-1, ACS_VLINE);
730 } 800 }
731 801
732 if (!buddylist) 802 if (!buddylist)
733 offset = 0; 803 offset = 0;
804 else
805 update_chat_status_window();
734 806
735 // Leave now if buddylist is empty or the roster is hidden 807 // Leave now if buddylist is empty or the roster is hidden
736 if (!buddylist || !Roster_Width) { 808 if (!buddylist || !Roster_Width) {
737 update_panels(); 809 update_panels();
738 doupdate(); 810 doupdate();
811 curs_set(cursor_backup);
739 return; 812 return;
740 } 813 }
741 814
742 name = g_new0(char, Roster_Width); 815 name = g_new0(char, Roster_Width);
743 816
751 // b) Make sure the current_buddy is visible 824 // b) Make sure the current_buddy is visible
752 i = g_list_position(buddylist, current_buddy); 825 i = g_list_position(buddylist, current_buddy);
753 if (i == -1) { // This is bad 826 if (i == -1) { // This is bad
754 scr_LogPrint(LPRINT_NORMAL, "Doh! Can't find current selected buddy!!"); 827 scr_LogPrint(LPRINT_NORMAL, "Doh! Can't find current selected buddy!!");
755 g_free(name); 828 g_free(name);
829 curs_set(cursor_backup);
756 return; 830 return;
757 } else if (i < offset) { 831 } else if (i < offset) {
758 offset = i; 832 offset = i;
759 } else if (i+1 > offset + maxy) { 833 } else if (i+1 > offset + maxy) {
760 offset = i + 1 - maxy; 834 offset = i + 1 - maxy;
764 838
765 buddy = buddylist; 839 buddy = buddylist;
766 rOffset = offset; 840 rOffset = offset;
767 841
768 for (i=0; i<maxy && buddy; buddy = g_list_next(buddy)) { 842 for (i=0; i<maxy && buddy; buddy = g_list_next(buddy)) {
769 char status = '?'; 843 unsigned short bflags, btype, ismsg, isgrp, ismuc, ishid;
770 char pending = ' '; 844
771 enum imstatus budstate; 845 bflags = buddy_getflags(BUDDATA(buddy));
772 unsigned short ismsg = buddy_getflags(BUDDATA(buddy)) & ROSTER_FLAG_MSG; 846 btype = buddy_gettype(BUDDATA(buddy));
773 unsigned short isgrp = buddy_gettype(BUDDATA(buddy)) & ROSTER_TYPE_GROUP; 847
774 unsigned short ismuc = buddy_gettype(BUDDATA(buddy)) & ROSTER_TYPE_ROOM; 848 ismsg = bflags & ROSTER_FLAG_MSG;
775 unsigned short ishid = buddy_getflags(BUDDATA(buddy)) & ROSTER_FLAG_HIDE; 849 ishid = bflags & ROSTER_FLAG_HIDE;
850 isgrp = btype & ROSTER_TYPE_GROUP;
851 ismuc = btype & ROSTER_TYPE_ROOM;
776 852
777 if (rOffset > 0) { 853 if (rOffset > 0) {
778 rOffset--; 854 rOffset--;
779 continue; 855 continue;
780 } 856 }
857
858 status = '?';
859 pending = ' ';
781 860
782 // Display message notice if there is a message flag, but not 861 // Display message notice if there is a message flag, but not
783 // for unfolded groups. 862 // for unfolded groups.
784 if (ismsg && (!isgrp || ishid)) { 863 if (ismsg && (!isgrp || ishid)) {
785 pending = '#'; 864 pending = '#';
786 } 865 }
787 866
788 budstate = buddy_getstatus(BUDDATA(buddy), NULL); 867 if (ismuc) {
789 if (budstate >= 0 && budstate < imstatus_size && currentstatus != offline) 868 if (buddy_getinsideroom(BUDDATA(buddy)))
790 status = imstatus2char[budstate]; 869 status = 'C';
870 else
871 status = 'x';
872 } else if (currentstatus != offline) {
873 enum imstatus budstate;
874 budstate = buddy_getstatus(BUDDATA(buddy), NULL);
875 if (budstate >= 0 && budstate < imstatus_size)
876 status = imstatus2char[budstate];
877 }
791 if (buddy == current_buddy) { 878 if (buddy == current_buddy) {
792 wattrset(rosterWnd, COLOR_PAIR(COLOR_ROSTERSEL)); 879 wattrset(rosterWnd, COLOR_PAIR(COLOR_ROSTERSEL));
793 // The 3 following lines aim to color the whole line 880 // The 3 following lines aim to color the whole line
794 wmove(rosterWnd, i, 0); 881 wmove(rosterWnd, i, 0);
795 for (n = 0; n < maxx; n++) 882 for (n = 0; n < maxx; n++)
799 wattrset(rosterWnd, COLOR_PAIR(COLOR_ROSTERNMSG)); 886 wattrset(rosterWnd, COLOR_PAIR(COLOR_ROSTERNMSG));
800 else 887 else
801 wattrset(rosterWnd, COLOR_PAIR(COLOR_ROSTER)); 888 wattrset(rosterWnd, COLOR_PAIR(COLOR_ROSTER));
802 } 889 }
803 890
804 if (ismuc) {
805 if (buddy_getinsideroom(BUDDATA(buddy)))
806 status = 'C';
807 else
808 status = 'x';
809 }
810
811 if (Roster_Width > 7) 891 if (Roster_Width > 7)
812 strncpy(name, buddy_getname(BUDDATA(buddy)), Roster_Width-7); 892 strncpy(name, buddy_getname(BUDDATA(buddy)), Roster_Width-7);
813 else 893 else
814 name[0] = 0; 894 name[0] = 0;
815 895
831 g_free(rline); 911 g_free(rline);
832 g_free(name); 912 g_free(name);
833 top_panel(inputPanel); 913 top_panel(inputPanel);
834 update_panels(); 914 update_panels();
835 doupdate(); 915 doupdate();
916 curs_set(cursor_backup);
836 } 917 }
837 918
838 // scr_RosterVisibility(status) 919 // scr_RosterVisibility(status)
839 // Set the roster visibility: 920 // Set the roster visibility:
840 // status=1 Show roster 921 // status=1 Show roster