comparison mcabber/src/screen.c @ 711:75dde88f1884

Introduce status lines
author Mikael Berthe <mikael@lilotux.net>
date Sat, 04 Mar 2006 18:50:21 +0100
parents 5aa66101807b
children e1639629c87b
comparison
equal deleted inserted replaced
710:0311d7e2bb1c 711:75dde88f1884
64 char cleared; // For ex, user has issued a /clear command... 64 char cleared; // For ex, user has issued a /clear command...
65 struct list_head list; 65 struct list_head list;
66 } window_entry_t; 66 } window_entry_t;
67 67
68 68
69 static WINDOW *rosterWnd, *chatWnd, *inputWnd; 69 static WINDOW *rosterWnd, *chatWnd, *inputWnd, *logWnd;
70 static WINDOW *logWnd, *logWnd_border; 70 static WINDOW *mainstatusWnd, *chatstatusWnd;
71 static PANEL *rosterPanel, *chatPanel, *inputPanel; 71 static PANEL *rosterPanel, *chatPanel, *inputPanel;
72 static PANEL *logPanel, *logPanel_border; 72 static PANEL *mainstatusPanel, *chatstatusPanel;
73 static PANEL *logPanel;
73 static int maxY, maxX; 74 static int maxY, maxX;
74 static window_entry_t *currentWindow; 75 static window_entry_t *currentWindow;
75 76
76 static int roster_hidden; 77 static int roster_hidden;
77 static int chatmode; 78 static int chatmode;
96 static int scr_WindowWidth(WINDOW * win) 97 static int scr_WindowWidth(WINDOW * win)
97 { 98 {
98 int x, y; 99 int x, y;
99 getmaxyx(win, y, x); 100 getmaxyx(win, y, x);
100 return x; 101 return x;
101 }
102
103 static void scr_draw_box(WINDOW * win, int y, int x, int height, int width,
104 int Color, chtype box, chtype border)
105 {
106 int i, j;
107
108 wattrset(win, COLOR_PAIR(Color));
109 for (i = 0; i < height; i++) {
110 wmove(win, y + i, x);
111 for (j = 0; j < width; j++)
112 if (!i && !j)
113 waddch(win, border | ACS_ULCORNER);
114 else if (i == height - 1 && !j)
115 waddch(win, border | ACS_LLCORNER);
116 else if (!i && j == width - 1)
117 waddch(win, box | ACS_URCORNER);
118 else if (i == height - 1 && j == width - 1)
119 waddch(win, box | ACS_LRCORNER);
120 else if (!i)
121 waddch(win, border | ACS_HLINE);
122 else if (i == height - 1)
123 waddch(win, box | ACS_HLINE);
124 else if (!j)
125 waddch(win, border | ACS_VLINE);
126 else if (j == width - 1)
127 waddch(win, box | ACS_VLINE);
128 else
129 waddch(win, box | ' ');
130 }
131 } 102 }
132 103
133 static int FindColor(const char *name) 104 static int FindColor(const char *name)
134 { 105 {
135 if (!strcmp(name, "default")) 106 if (!strcmp(name, "default"))
157 static void ParseColors(void) 128 static void ParseColors(void)
158 { 129 {
159 const char *colors[8] = { 130 const char *colors[8] = {
160 "", "", 131 "", "",
161 "general", 132 "general",
133 "status",
162 "newmsg", 134 "newmsg",
163 "rosterselect", 135 "rosterselect",
164 "rosternormal", 136 "rosternormal",
165 NULL 137 NULL
166 }; 138 };
167 139
168 char *tmp = g_new(char, 512); 140 char *tmp = g_new(char, 512);
169 const char *color; 141 const char *color;
170 const char *background = settings_opt_get("color_background"); 142 const char *background = settings_opt_get("color_background");
171 const char *backselected = settings_opt_get("color_backselected"); 143 const char *backselected = settings_opt_get("color_backselected");
144 const char *backstatus = settings_opt_get("color_backstatus");
172 int i = 0; 145 int i = 0;
173 146
174 // Default values 147 // Default values
175 if (!background) background = "blue"; 148 if (!background) background = "black";
176 if (!backselected) backselected = "cyan"; 149 if (!backselected) backselected = "cyan";
150 if (!backstatus) backstatus = "blue";
177 151
178 while (colors[i]) { 152 while (colors[i]) {
179 snprintf(tmp, 512, "color_%s", colors[i]); 153 snprintf(tmp, 512, "color_%s", colors[i]);
180 color = settings_opt_get(tmp); 154 color = settings_opt_get(tmp);
181 155
184 init_pair(1, COLOR_BLACK, COLOR_WHITE); 158 init_pair(1, COLOR_BLACK, COLOR_WHITE);
185 break; 159 break;
186 case 2: 160 case 2:
187 init_pair(2, COLOR_WHITE, COLOR_BLACK); 161 init_pair(2, COLOR_WHITE, COLOR_BLACK);
188 break; 162 break;
189 case 3: 163 case COLOR_GENERAL:
190 init_pair(3, ((color) ? FindColor(color) : COLOR_WHITE), 164 init_pair(i+1, ((color) ? FindColor(color) : COLOR_WHITE),
191 FindColor(background)); 165 FindColor(background));
192 break; 166 break;
193 case 4: 167 case COLOR_STATUS:
194 init_pair(4, ((color) ? FindColor(color) : COLOR_RED), 168 init_pair(i+1, ((color) ? FindColor(color) : COLOR_WHITE),
169 FindColor(backstatus));
170 break;
171 case COLOR_NMSG:
172 init_pair(i+1, ((color) ? FindColor(color) : COLOR_RED),
195 FindColor(background)); 173 FindColor(background));
196 break; 174 break;
197 case 5: 175 case COLOR_BD_DESSEL:
198 init_pair(5, ((color) ? FindColor(color) : COLOR_BLACK), 176 init_pair(i+1, ((color) ? FindColor(color) : COLOR_BLUE),
199 FindColor(backselected)); 177 FindColor(backselected));
200 break; 178 break;
201 case 6: 179 case COLOR_BD_DES:
202 init_pair(6, ((color) ? FindColor(color) : COLOR_MAGENTA), 180 init_pair(i+1, ((color) ? FindColor(color) : COLOR_GREEN),
203 FindColor(background)); 181 FindColor(background));
204 break; 182 break;
205 } 183 }
206 i++; 184 i++;
207 } 185 }
591 569
592 if (fullinit) { 570 if (fullinit) {
593 /* Create windows */ 571 /* Create windows */
594 rosterWnd = newwin(CHAT_WIN_HEIGHT, Roster_Width, 0, 0); 572 rosterWnd = newwin(CHAT_WIN_HEIGHT, Roster_Width, 0, 0);
595 chatWnd = newwin(CHAT_WIN_HEIGHT, maxX - Roster_Width, 0, Roster_Width); 573 chatWnd = newwin(CHAT_WIN_HEIGHT, maxX - Roster_Width, 0, Roster_Width);
596 logWnd_border = newwin(Log_Win_Height, maxX, CHAT_WIN_HEIGHT, 0); 574 logWnd = newwin(Log_Win_Height-2, maxX, CHAT_WIN_HEIGHT+1, 0);
597 logWnd = newwin(Log_Win_Height-2, maxX-2, CHAT_WIN_HEIGHT+1, 1); 575 chatstatusWnd = newwin(1, maxX, CHAT_WIN_HEIGHT, 0);
576 mainstatusWnd = newwin(1, maxX, maxY-2, 0);
598 inputWnd = newwin(1, maxX, maxY-1, 0); 577 inputWnd = newwin(1, maxX, maxY-1, 0);
599 if (!rosterWnd || !chatWnd || !logWnd || !inputWnd) { 578 if (!rosterWnd || !chatWnd || !logWnd || !inputWnd) {
600 scr_TerminateCurses(); 579 scr_TerminateCurses();
601 fprintf(stderr, "Cannot create windows!\n"); 580 fprintf(stderr, "Cannot create windows!\n");
602 exit(EXIT_FAILURE); 581 exit(EXIT_FAILURE);
603 } 582 }
604 wbkgd(rosterWnd, COLOR_PAIR(COLOR_GENERAL)); 583 wbkgd(rosterWnd, COLOR_PAIR(COLOR_GENERAL));
605 wbkgd(chatWnd, COLOR_PAIR(COLOR_GENERAL)); 584 wbkgd(chatWnd, COLOR_PAIR(COLOR_GENERAL));
606 wbkgd(logWnd_border, COLOR_PAIR(COLOR_GENERAL));
607 wbkgd(logWnd, COLOR_PAIR(COLOR_GENERAL)); 585 wbkgd(logWnd, COLOR_PAIR(COLOR_GENERAL));
586 wbkgd(chatstatusWnd, COLOR_PAIR(COLOR_STATUS));
587 wbkgd(mainstatusWnd, COLOR_PAIR(COLOR_STATUS));
608 } else { 588 } else {
609 /* Resize/move windows */ 589 /* Resize/move windows */
610 wresize(rosterWnd, CHAT_WIN_HEIGHT, Roster_Width); 590 wresize(rosterWnd, CHAT_WIN_HEIGHT, Roster_Width);
611 wresize(chatWnd, CHAT_WIN_HEIGHT, maxX - Roster_Width); 591 wresize(chatWnd, CHAT_WIN_HEIGHT, maxX - Roster_Width);
612 mvwin(chatWnd, 0, Roster_Width); 592 mvwin(chatWnd, 0, Roster_Width);
613 593
614 wresize(logWnd_border, Log_Win_Height, maxX); 594 wresize(logWnd, Log_Win_Height-2, maxX);
615 wresize(logWnd, Log_Win_Height-2, maxX-2); 595 mvwin(logWnd, CHAT_WIN_HEIGHT+1, 0);
616 mvwin(logWnd_border, CHAT_WIN_HEIGHT, 0); 596
617 mvwin(logWnd, CHAT_WIN_HEIGHT+1, 1); 597 // Resize & move chat status window
618 598 wresize(chatstatusWnd, 1, maxX);
599 mvwin(chatstatusWnd, CHAT_WIN_HEIGHT, 0);
600 // Resize & move main status window
601 wresize(mainstatusWnd, 1, maxX);
602 mvwin(mainstatusWnd, maxY-2, 0);
603 // Resize & move input line window
619 wresize(inputWnd, 1, maxX); 604 wresize(inputWnd, 1, maxX);
620 mvwin(inputWnd, maxY-1, 0); 605 mvwin(inputWnd, maxY-1, 0);
621 606
622 werase(chatWnd); 607 werase(chatWnd);
623 } 608 }
625 /* Draw/init windows */ 610 /* Draw/init windows */
626 611
627 mvwprintw(chatWnd, 0, 0, "Thanks for using mcabber.\n"); 612 mvwprintw(chatWnd, 0, 0, "Thanks for using mcabber.\n");
628 mvwprintw(chatWnd, 1, 0, "http://www.lilotux.net/~mikael/mcabber/"); 613 mvwprintw(chatWnd, 1, 0, "http://www.lilotux.net/~mikael/mcabber/");
629 614
630 // - Draw/clear the log window
631 scr_draw_box(logWnd_border, 0, 0, Log_Win_Height, maxX, COLOR_GENERAL, 0, 0);
632 // Auto-scrolling in log window 615 // Auto-scrolling in log window
633 scrollok(logWnd, TRUE); 616 scrollok(logWnd, TRUE);
634 617
635 618
636 if (fullinit) { 619 if (fullinit) {
639 nodelay(inputWnd, TRUE); 622 nodelay(inputWnd, TRUE);
640 623
641 // Create panels 624 // Create panels
642 rosterPanel = new_panel(rosterWnd); 625 rosterPanel = new_panel(rosterWnd);
643 chatPanel = new_panel(chatWnd); 626 chatPanel = new_panel(chatWnd);
644 logPanel_border = new_panel(logWnd_border);
645 logPanel = new_panel(logWnd); 627 logPanel = new_panel(logWnd);
628 chatstatusPanel = new_panel(chatstatusWnd);
629 mainstatusPanel = new_panel(mainstatusWnd);
646 inputPanel = new_panel(inputWnd); 630 inputPanel = new_panel(inputWnd);
647 631
648 if (utf8_mode) 632 if (utf8_mode)
649 scr_LogPrint(LPRINT_NORMAL, "WARNING: UTF-8 not yet supported!"); 633 scr_LogPrint(LPRINT_NORMAL, "WARNING: UTF-8 not yet supported!");
650 } else { 634 } else {
651 // Update panels 635 // Update panels
652 replace_panel(rosterPanel, rosterWnd); 636 replace_panel(rosterPanel, rosterWnd);
653 replace_panel(chatPanel, chatWnd); 637 replace_panel(chatPanel, chatWnd);
654 replace_panel(logPanel, logWnd); 638 replace_panel(logPanel, logWnd);
655 replace_panel(logPanel_border, logWnd_border); 639 replace_panel(chatstatusPanel, chatstatusWnd);
640 replace_panel(mainstatusPanel, mainstatusWnd);
656 replace_panel(inputPanel, inputWnd); 641 replace_panel(inputPanel, inputWnd);
657 } 642 }
658 643
659 // We'll need to redraw the roster 644 // We'll need to redraw the roster
660 update_roster = TRUE; 645 update_roster = TRUE;