diff options
Diffstat (limited to 'vchat-ui.c')
-rwxr-xr-x | vchat-ui.c | 284 |
1 files changed, 120 insertions, 164 deletions
@@ -30,13 +30,13 @@ | |||
30 | #include "vchat.h" | 30 | #include "vchat.h" |
31 | 31 | ||
32 | /* version of this module */ | 32 | /* version of this module */ |
33 | unsigned char *vchat_ui_version = "$Id$"; | 33 | char *vchat_ui_version = "$Id$"; |
34 | 34 | ||
35 | /* externally used variables */ | 35 | /* externally used variables */ |
36 | /* current string in topic window */ | 36 | /* current string in topic window */ |
37 | unsigned char topicstr[TOPICSTRSIZE] = "[] VChat 0.16"; | 37 | char topicstr[TOPICSTRSIZE] = "[] VChat 0.16"; |
38 | /* current string in console window */ | 38 | /* current string in console window */ |
39 | unsigned char consolestr[CONSOLESTRSIZE] = "[ Get help: .h for server /h for client commands"; | 39 | char consolestr[CONSOLESTRSIZE] = "[ Get help: .h for server /h for client commands"; |
40 | 40 | ||
41 | static unsigned int ui_init = 0; | 41 | static unsigned int ui_init = 0; |
42 | 42 | ||
@@ -48,8 +48,6 @@ static WINDOW *channel = NULL; | |||
48 | static WINDOW *private = NULL; | 48 | static WINDOW *private = NULL; |
49 | static WINDOW *output = NULL; | 49 | static WINDOW *output = NULL; |
50 | 50 | ||
51 | static FILE *vchat_logfile = NULL; | ||
52 | |||
53 | /* our screen dimensions */ | 51 | /* our screen dimensions */ |
54 | static int screensx = 0; | 52 | static int screensx = 0; |
55 | static int screensy = 0; | 53 | static int screensy = 0; |
@@ -68,12 +66,13 @@ static int privheight_desired = 0; | |||
68 | static int privwinhidden = 0; | 66 | static int privwinhidden = 0; |
69 | int usetime = 1; | 67 | int usetime = 1; |
70 | int outputcountdown = 0; | 68 | int outputcountdown = 0; |
69 | char *querypartner = NULL; | ||
71 | 70 | ||
72 | struct sb_entry { | 71 | struct sb_entry { |
73 | int id; | 72 | int id; |
74 | time_t when; | 73 | time_t when; |
75 | int stamp; | 74 | int stamp; |
76 | unsigned char *what; | 75 | char *what; |
77 | struct sb_entry *link; | 76 | struct sb_entry *link; |
78 | }; | 77 | }; |
79 | 78 | ||
@@ -93,9 +92,9 @@ static int sb_win = 0; /* 0 for pub, 1 for priv */ | |||
93 | 92 | ||
94 | /* struct to keep filter list */ | 93 | /* struct to keep filter list */ |
95 | struct filt { | 94 | struct filt { |
96 | unsigned char colour; | 95 | char colour; |
97 | unsigned int id; | 96 | unsigned int id; |
98 | unsigned char *text; | 97 | char *text; |
99 | regex_t regex; | 98 | regex_t regex; |
100 | struct filt *next; | 99 | struct filt *next; |
101 | }; | 100 | }; |
@@ -119,7 +118,7 @@ static void resize_output (void); | |||
119 | static int getsbeheight (struct sb_entry *entry, const int xwidth, int needstime ); | 118 | static int getsbeheight (struct sb_entry *entry, const int xwidth, int needstime ); |
120 | static int getsbdataheight (struct sb_data *data, const int xwidth, int needstime ); | 119 | static int getsbdataheight (struct sb_data *data, const int xwidth, int needstime ); |
121 | /* CURRENTLY UNUSED | 120 | /* CURRENTLY UNUSED |
122 | static void writecolorized (WINDOW *win, unsigned char *string); | 121 | static void writecolorized (WINDOW *win, char *string); |
123 | */ | 122 | */ |
124 | 123 | ||
125 | enum { | 124 | enum { |
@@ -129,10 +128,20 @@ enum { | |||
129 | RMFILTER_KEEPANDSTOP | 128 | RMFILTER_KEEPANDSTOP |
130 | }; | 129 | }; |
131 | 130 | ||
131 | /* */ | ||
132 | static void | ||
133 | togglequery() { | ||
134 | if( querypartner && private ) { | ||
135 | { struct sb_data *tmp = sb_pub; sb_pub = sb_priv; sb_priv = tmp; } | ||
136 | { WINDOW *tmp= private; private = channel; channel = tmp; } | ||
137 | } | ||
138 | } | ||
139 | |||
132 | /* readlines callback when a line is completed */ | 140 | /* readlines callback when a line is completed */ |
133 | static void | 141 | static void |
134 | linecomplete (unsigned char *line) | 142 | linecomplete (char *line) |
135 | { | 143 | { |
144 | char *c; | ||
136 | int i; | 145 | int i; |
137 | 146 | ||
138 | /* send linefeed, return pointer, reset cursors */ | 147 | /* send linefeed, return pointer, reset cursors */ |
@@ -157,6 +166,10 @@ linecomplete (unsigned char *line) | |||
157 | handleline (line); | 166 | handleline (line); |
158 | free (line); | 167 | free (line); |
159 | 168 | ||
169 | /* If in query mode, feed query prefix */ | ||
170 | if (( c = querypartner )) | ||
171 | while( *c ) rl_stuff_char( *c++ ); | ||
172 | |||
160 | /* wipe input line and reset cursor */ | 173 | /* wipe input line and reset cursor */ |
161 | wmove (input, 0, 0); | 174 | wmove (input, 0, 0); |
162 | for (i = 0; i < input->_maxx; i++) | 175 | for (i = 0; i < input->_maxx; i++) |
@@ -212,8 +225,8 @@ userinput (void) | |||
212 | } | 225 | } |
213 | 226 | ||
214 | static int | 227 | static int |
215 | calcdrawcus (unsigned char * const str) { | 228 | calcdrawcus (char * const str) { |
216 | unsigned char *tmp = str; | 229 | char *tmp = str; |
217 | int zero = 0; | 230 | int zero = 0; |
218 | while( *tmp && (*tmp!=' ') && (*tmp!='\n')) { if(*tmp==1) zero+=2; tmp++; } | 231 | while( *tmp && (*tmp!=' ') && (*tmp!='\n')) { if(*tmp==1) zero+=2; tmp++; } |
219 | return (tmp - str) - zero; | 232 | return (tmp - str) - zero; |
@@ -240,7 +253,7 @@ sb_clear ( struct sb_data **sb ) { | |||
240 | }*/ | 253 | }*/ |
241 | 254 | ||
242 | static struct sb_entry* | 255 | static struct sb_entry* |
243 | sb_add (struct sb_data *sb, unsigned char *line, time_t when) { | 256 | sb_add (struct sb_data *sb, char *line, time_t when) { |
244 | struct sb_entry *newone = malloc (sizeof(struct sb_entry)); | 257 | struct sb_entry *newone = malloc (sizeof(struct sb_entry)); |
245 | if( newone ) { | 258 | if( newone ) { |
246 | if( sb->count == sb->scroll ) sb->scroll++; | 259 | if( sb->count == sb->scroll ) sb->scroll++; |
@@ -282,7 +295,7 @@ void showout (void) | |||
282 | resize(0); | 295 | resize(0); |
283 | } | 296 | } |
284 | 297 | ||
285 | void writeout (unsigned char *str) | 298 | void writeout (char *str) |
286 | { | 299 | { |
287 | int i; | 300 | int i; |
288 | sb_add(sb_out,str,time(NULL)); | 301 | sb_add(sb_out,str,time(NULL)); |
@@ -290,43 +303,47 @@ void writeout (unsigned char *str) | |||
290 | if( i > outputwidth_desired ) outputwidth_desired = i; | 303 | if( i > outputwidth_desired ) outputwidth_desired = i; |
291 | } | 304 | } |
292 | 305 | ||
293 | int writechan (unsigned char *str) { | 306 | int writechan (char *str) { |
294 | struct sb_entry *tmp; | 307 | struct sb_entry *tmp; |
295 | int i = 0; | 308 | int i = 0; |
296 | time_t now = time(NULL); | 309 | time_t now = time(NULL); |
297 | tmp = sb_add(sb_pub,str,now); | 310 | tmp = sb_add(sb_pub,str,now); |
298 | 311 | ||
299 | if( getintoption( CF_KEEPLOG ) && vchat_logfile ) | ||
300 | fprintf( vchat_logfile, "%016llX0%s\n", (signed long long)now, str); | ||
301 | |||
302 | if ( (sb_pub->scroll == sb_pub->count) && ((filtertype == 0) || ( testfilter(tmp)))) { | 312 | if ( (sb_pub->scroll == sb_pub->count) && ((filtertype == 0) || ( testfilter(tmp)))) { |
303 | i = writescr(channel, tmp); | 313 | i = writescr(channel, tmp); |
304 | wnoutrefresh(channel); | 314 | wnoutrefresh(channel); |
305 | } | 315 | } |
306 | consoleline(NULL); | 316 | |
317 | if( querypartner && private ) | ||
318 | topicline(NULL); | ||
319 | else | ||
320 | consoleline(NULL); | ||
321 | |||
307 | return i; | 322 | return i; |
308 | } | 323 | } |
309 | 324 | ||
310 | int writecf (formtstr id,unsigned char *str) { | 325 | int writecf (formtstr id, char *str) { |
311 | struct sb_entry *tmp; | 326 | struct sb_entry *tmp; |
312 | int i = 0; | 327 | int i = 0; |
313 | time_t now = time(NULL); | 328 | time_t now = time(NULL); |
314 | snprintf(tmpstr,TMPSTRSIZE,getformatstr(id),str); | 329 | snprintf(tmpstr,TMPSTRSIZE,getformatstr(id),str); |
315 | tmp = sb_add(sb_pub,tmpstr,now); | 330 | tmp = sb_add(sb_pub,tmpstr,now); |
316 | 331 | ||
317 | if( getintoption( CF_KEEPLOG ) && vchat_logfile ) | ||
318 | fprintf( vchat_logfile, "%016llX0%s\n", (unsigned long long)now, tmpstr); | ||
319 | |||
320 | if ( (sb_pub->scroll == sb_pub->count) && | 332 | if ( (sb_pub->scroll == sb_pub->count) && |
321 | ((filtertype == 0) || ( testfilter(tmp)))) { | 333 | ((filtertype == 0) || ( testfilter(tmp)))) { |
322 | i = writescr(channel, tmp); | 334 | i = writescr(channel, tmp); |
323 | wnoutrefresh(channel); | 335 | wnoutrefresh(channel); |
324 | } | 336 | } |
325 | consoleline(NULL); | 337 | |
338 | if( querypartner && private ) | ||
339 | topicline(NULL); | ||
340 | else | ||
341 | consoleline(NULL); | ||
342 | |||
326 | return i; | 343 | return i; |
327 | } | 344 | } |
328 | 345 | ||
329 | int writepriv (unsigned char *str, int maybeep) { | 346 | int writepriv (char *str, int maybeep) { |
330 | int i = 0; | 347 | int i = 0; |
331 | if (private) { | 348 | if (private) { |
332 | 349 | ||
@@ -334,10 +351,6 @@ int writepriv (unsigned char *str, int maybeep) { | |||
334 | struct sb_entry *tmp; | 351 | struct sb_entry *tmp; |
335 | tmp = sb_add(sb_priv,str,now); | 352 | tmp = sb_add(sb_priv,str,now); |
336 | 353 | ||
337 | if( getintoption( CF_KEEPLOG ) && vchat_logfile ) { | ||
338 | fprintf( vchat_logfile, "%016llX1%s\n", (unsigned long long)now, str); | ||
339 | } | ||
340 | |||
341 | if ( !privwinhidden && (sb_priv->scroll == sb_priv->count) && | 354 | if ( !privwinhidden && (sb_priv->scroll == sb_priv->count) && |
342 | ((filtertype == 0) || ( testfilter(tmp)))) { | 355 | ((filtertype == 0) || ( testfilter(tmp)))) { |
343 | i = writescr(private, tmp); | 356 | i = writescr(private, tmp); |
@@ -350,7 +363,12 @@ int writepriv (unsigned char *str, int maybeep) { | |||
350 | resize(0); | 363 | resize(0); |
351 | } | 364 | } |
352 | wnoutrefresh(private); | 365 | wnoutrefresh(private); |
353 | topicline(NULL); | 366 | |
367 | if( querypartner && private ) | ||
368 | consoleline(NULL); | ||
369 | else | ||
370 | topicline(NULL); | ||
371 | |||
354 | } else | 372 | } else |
355 | i = writechan( str ); | 373 | i = writechan( str ); |
356 | 374 | ||
@@ -388,13 +406,13 @@ static int attributes[] = { A_ALTCHARSET, A_BOLD, 0, A_DIM, 0, 0, 0, 0, A_INVIS, | |||
388 | 0, 0, 1, 0, 0 }; | 406 | 0, 0, 1, 0, 0 }; |
389 | 407 | ||
390 | static void | 408 | static void |
391 | docolorize (unsigned char colour, ncurs_attr *attr, ncurs_attr orgattr) { | 409 | docolorize (char colour, ncurs_attr *attr, ncurs_attr orgattr) { |
392 | if( colour== '0') { | 410 | if( colour== '0') { |
393 | *attr = orgattr; | 411 | *attr = orgattr; |
394 | } else if( ( colour > '0') && ( colour <= '9')) { | 412 | } else if( ( colour > '0') && ( colour <= '9')) { |
395 | BCOLR_SET( attr, colour - '0' ); | 413 | BCOLR_SET( attr, colour - '0' ); |
396 | } else { | 414 | } else { |
397 | unsigned char upc = colour & ( 0x20 ^ 0xff ); /* colour AND NOT 0x20 */ | 415 | char upc = colour & ( 0x20 ^ 0xff ); /* colour AND NOT 0x20 */ |
398 | attr_t newattr; | 416 | attr_t newattr; |
399 | if( ( upc >= 'A') && ( upc<='Z' ) && ( newattr = attributes[upc - 'A']) ) | 417 | if( ( upc >= 'A') && ( upc<='Z' ) && ( newattr = attributes[upc - 'A']) ) |
400 | attr->attr = ( colour & 0x20 ) ? attr->attr | newattr : attr->attr & ~newattr; | 418 | attr->attr = ( colour & 0x20 ) ? attr->attr | newattr : attr->attr & ~newattr; |
@@ -404,13 +422,13 @@ docolorize (unsigned char colour, ncurs_attr *attr, ncurs_attr orgattr) { | |||
404 | /* draw arbitrary strings */ | 422 | /* draw arbitrary strings */ |
405 | static int | 423 | static int |
406 | writescr ( WINDOW *win, struct sb_entry *entry ) { | 424 | writescr ( WINDOW *win, struct sb_entry *entry ) { |
407 | unsigned char tmp [64]; | 425 | char tmp [64]; |
408 | int charcount = 0; | 426 | int charcount = 0; |
409 | int i; | 427 | int i; |
410 | int textlen = strlen( entry->what ); | 428 | int textlen = strlen( entry->what ); |
411 | int timelen = ((win == channel)||(win == private)) && usetime ? | 429 | int timelen = ((win == channel)||(win == private)) && usetime ? |
412 | (int)strftime(tmp,64,getformatstr(FS_TIME),localtime(&entry->when)) : 0; | 430 | (int)strftime(tmp,64,getformatstr(FS_TIME),localtime(&entry->when)) : 0; |
413 | unsigned char textbuffer[ textlen+timelen+1 ]; | 431 | char textbuffer[ textlen+timelen+1 ]; |
414 | ncurs_attr attrbuffer[ textlen+timelen+1 ]; | 432 | ncurs_attr attrbuffer[ textlen+timelen+1 ]; |
415 | ncurs_attr orgattr; | 433 | ncurs_attr orgattr; |
416 | 434 | ||
@@ -446,9 +464,9 @@ writescr ( WINDOW *win, struct sb_entry *entry ) { | |||
446 | 464 | ||
447 | /* hilite */ | 465 | /* hilite */ |
448 | if((win == channel)||(win == private)) { /* do not higlight bars */ | 466 | if((win == channel)||(win == private)) { /* do not higlight bars */ |
449 | filt *flt = filterlist; | 467 | filt *flt = filterlist; |
450 | unsigned char *instr = textbuffer; | 468 | char *instr = textbuffer; |
451 | regmatch_t match; | 469 | regmatch_t match; |
452 | int j; | 470 | int j; |
453 | 471 | ||
454 | while( flt ) { | 472 | while( flt ) { |
@@ -494,87 +512,6 @@ writescr ( WINDOW *win, struct sb_entry *entry ) { | |||
494 | } | 512 | } |
495 | 513 | ||
496 | static void | 514 | static void |
497 | writelog_processentry ( FILE *file, struct sb_entry* entry ) | ||
498 | { | ||
499 | char *outtmp; | ||
500 | int outoff = 0; | ||
501 | if( usetime ) { | ||
502 | outtmp = tmpstr+64; | ||
503 | strftime(outtmp,64,getformatstr(FS_TIME),localtime(&entry->when)); | ||
504 | while(*outtmp) | ||
505 | if( *outtmp > 1 ) | ||
506 | tmpstr[outoff++] = *(outtmp++); | ||
507 | else | ||
508 | if( *(++outtmp)) | ||
509 | outtmp++; | ||
510 | } | ||
511 | |||
512 | outtmp = entry->what; | ||
513 | while(*outtmp) | ||
514 | while(*outtmp && ( outoff < TMPSTRSIZE-1) ) { | ||
515 | if( *outtmp > 1 ) | ||
516 | tmpstr[outoff++] = *(outtmp++); | ||
517 | else | ||
518 | if( *(++outtmp)) | ||
519 | outtmp++; | ||
520 | tmpstr[outoff]=0; outoff = 0; | ||
521 | fputs( tmpstr, file ); | ||
522 | } | ||
523 | |||
524 | fputc( '\n', file); | ||
525 | } | ||
526 | |||
527 | void | ||
528 | writelog_i ( FILE *file) | ||
529 | { | ||
530 | if( !private ) { | ||
531 | writelog( file); | ||
532 | } else { | ||
533 | struct sb_entry *now1= sb_pub->last, *prev1 = NULL, *tmp; | ||
534 | struct sb_entry *now2= sb_priv->last, *prev2 = NULL; | ||
535 | fputs( "Interleaved messages:\n\n", file); | ||
536 | while( now1 || now2 ) { | ||
537 | int process; | ||
538 | if( now1 && now2 ) { | ||
539 | process = ( now1->when < now2->when ) ? 1 : 2; | ||
540 | } else { | ||
541 | process = now1 ? 1 : 2; | ||
542 | } | ||
543 | |||
544 | if( process == 1 ) { | ||
545 | writelog_processentry( file, now1 ); | ||
546 | tmp = now1; now1 = (struct sb_entry*)((unsigned long)now1->link ^ (unsigned long)prev1); prev1 = tmp; | ||
547 | } else { | ||
548 | writelog_processentry( file, now2 ); | ||
549 | tmp = now2; now2 = (struct sb_entry*)((unsigned long)now2->link ^ (unsigned long)prev2); prev2 = tmp; | ||
550 | } | ||
551 | } | ||
552 | } | ||
553 | } | ||
554 | |||
555 | void | ||
556 | writelog ( FILE *file ) | ||
557 | { | ||
558 | if( sb_pub->last ) { | ||
559 | struct sb_entry *now = sb_pub->last, *prev = NULL, *tmp; | ||
560 | fputs( "Public messages:\n\n", file); | ||
561 | while( now ) { | ||
562 | writelog_processentry( file, now ); | ||
563 | tmp = now; now = (struct sb_entry*)((unsigned long)now->link ^ (unsigned long)prev); prev = tmp; | ||
564 | } | ||
565 | putc( '\n', file ); | ||
566 | } | ||
567 | if( private && sb_priv->last ) { | ||
568 | struct sb_entry *now = sb_priv->last, *prev = NULL, *tmp; | ||
569 | fputs( "Private messages:\n\n", file); | ||
570 | while( now ) { | ||
571 | writelog_processentry( file, now ); | ||
572 | tmp = now; now = (struct sb_entry*)((unsigned long)now->link ^ (unsigned long)prev); prev = tmp; | ||
573 | } | ||
574 | } | ||
575 | } | ||
576 | |||
577 | static void | ||
578 | resize_output ( ) | 515 | resize_output ( ) |
579 | { | 516 | { |
580 | int outputwidth = (outputwidth_desired + 7 > screensx) ? screensx - 7 : outputwidth_desired; | 517 | int outputwidth = (outputwidth_desired + 7 > screensx) ? screensx - 7 : outputwidth_desired; |
@@ -587,7 +524,9 @@ resize_output ( ) | |||
587 | } | 524 | } |
588 | 525 | ||
589 | static void | 526 | static void |
590 | doscroll( int up ) { | 527 | doscroll ( int up ) { |
528 | togglequery(); | ||
529 | { | ||
591 | WINDOW *destwin = (sb_win && private) ? private : channel; | 530 | WINDOW *destwin = (sb_win && private) ? private : channel; |
592 | struct sb_data *sb = (sb_win && private) ? sb_priv : sb_pub; | 531 | struct sb_data *sb = (sb_win && private) ? sb_priv : sb_pub; |
593 | struct sb_entry *now = sb->entries, *prev = NULL, *tmp; | 532 | struct sb_entry *now = sb->entries, *prev = NULL, *tmp; |
@@ -617,7 +556,14 @@ doscroll( int up ) { | |||
617 | 556 | ||
618 | drawwin(destwin, sb); | 557 | drawwin(destwin, sb); |
619 | wnoutrefresh(destwin); | 558 | wnoutrefresh(destwin); |
620 | if( sb_win && private ) topicline(NULL); else consoleline(NULL); | 559 | |
560 | togglequery(); | ||
561 | |||
562 | if( private && (destwin == channel) ) | ||
563 | topicline( NULL); | ||
564 | else | ||
565 | consoleline( NULL); | ||
566 | } | ||
621 | } | 567 | } |
622 | 568 | ||
623 | 569 | ||
@@ -634,7 +580,7 @@ scrolldown (void) | |||
634 | } | 580 | } |
635 | 581 | ||
636 | void | 582 | void |
637 | scrollwin (vod) | 583 | scrollwin (void) |
638 | { | 584 | { |
639 | if (!sb_win && private && !privwinhidden) sb_win = 1; | 585 | if (!sb_win && private && !privwinhidden) sb_win = 1; |
640 | else sb_win = 0; | 586 | else sb_win = 0; |
@@ -643,7 +589,7 @@ scrollwin (vod) | |||
643 | } | 589 | } |
644 | 590 | ||
645 | void | 591 | void |
646 | growprivwin (vod) { | 592 | growprivwin (void) { |
647 | if( private ) { | 593 | if( private ) { |
648 | if( privwinhidden) | 594 | if( privwinhidden) |
649 | privwinhidden = 0; | 595 | privwinhidden = 0; |
@@ -653,7 +599,7 @@ growprivwin (vod) { | |||
653 | } | 599 | } |
654 | } | 600 | } |
655 | 601 | ||
656 | void toggleprivwin (vod) { | 602 | void toggleprivwin (void) { |
657 | if( outputshown ) { | 603 | if( outputshown ) { |
658 | outputshown = 0; | 604 | outputshown = 0; |
659 | resize(0); | 605 | resize(0); |
@@ -674,7 +620,7 @@ void toggleprivwin (vod) { | |||
674 | } | 620 | } |
675 | 621 | ||
676 | void | 622 | void |
677 | shrinkprivwin (vod) { | 623 | shrinkprivwin (void) { |
678 | if( private && !privwinhidden ) { | 624 | if( private && !privwinhidden ) { |
679 | if( --privheight_desired < 1) privheight_desired = 1; | 625 | if( --privheight_desired < 1) privheight_desired = 1; |
680 | if( privheight_desired > screensy - 5) privheight_desired = screensy - 5; | 626 | if( privheight_desired > screensy - 5) privheight_desired = screensy - 5; |
@@ -778,7 +724,7 @@ forceredraw (void) | |||
778 | if(console) wclear(console); | 724 | if(console) wclear(console); |
779 | if(topic) wclear(topic); | 725 | if(topic) wclear(topic); |
780 | if(private) wclear(private); | 726 | if(private) wclear(private); |
781 | if(channel) wclear( channel ); | 727 | if(channel) wclear(channel ); |
782 | if(output) wclear(output); | 728 | if(output) wclear(output); |
783 | if(input) wclear(input); | 729 | if(input) wclear(input); |
784 | resize(0); | 730 | resize(0); |
@@ -828,6 +774,8 @@ resize (int signal) | |||
828 | * Arrange windows on screen | 774 | * Arrange windows on screen |
829 | *****/ | 775 | *****/ |
830 | 776 | ||
777 | togglequery(); | ||
778 | |||
831 | /* console and input are always there and always 1 line tall */ | 779 | /* console and input are always there and always 1 line tall */ |
832 | wresize(console,1,screensx); | 780 | wresize(console,1,screensx); |
833 | wresize(input,1,screensx); | 781 | wresize(input,1,screensx); |
@@ -882,6 +830,8 @@ resize (int signal) | |||
882 | if(private && !privwinhidden ) | 830 | if(private && !privwinhidden ) |
883 | wnoutrefresh(private); | 831 | wnoutrefresh(private); |
884 | 832 | ||
833 | togglequery(); | ||
834 | |||
885 | /* Resize and draw our message window, render topic and | 835 | /* Resize and draw our message window, render topic and |
886 | console line */ | 836 | console line */ |
887 | if(outputshown) resize_output(); | 837 | if(outputshown) resize_output(); |
@@ -1277,34 +1227,6 @@ initui (void) | |||
1277 | showout( ); | 1227 | showout( ); |
1278 | */ | 1228 | */ |
1279 | 1229 | ||
1280 | if( getintoption( CF_KEEPLOG ) ) { | ||
1281 | unsigned char *logfile = getstroption( CF_LOGFILE ); | ||
1282 | if( logfile && *logfile ) { | ||
1283 | if( *logfile == '~' ) | ||
1284 | logfile = tilde_expand( logfile ); | ||
1285 | vchat_logfile = fopen( logfile, "r+" ); | ||
1286 | if( vchat_logfile ) { | ||
1287 | time_t now; | ||
1288 | long long now_; | ||
1289 | char dst; | ||
1290 | int lenstr; | ||
1291 | while( !feof( vchat_logfile)) { | ||
1292 | if( (fscanf( vchat_logfile, "%016llX%c", (unsigned long long*)&now_, &dst)) && | ||
1293 | ((dst == '0') || (dst == '1'))) | ||
1294 | { | ||
1295 | now = (time_t)now_; | ||
1296 | if(fgets(tmpstr, TMPSTRSIZE, vchat_logfile)) { | ||
1297 | lenstr = strlen( tmpstr ); | ||
1298 | tmpstr[lenstr-1] = '\0'; | ||
1299 | sb_add( dst == '0' ? sb_pub : sb_priv, tmpstr, now); | ||
1300 | } | ||
1301 | } else | ||
1302 | while( !feof( vchat_logfile) && ( fgetc( vchat_logfile ) != '\n')); | ||
1303 | } | ||
1304 | } | ||
1305 | } | ||
1306 | } | ||
1307 | |||
1308 | resize(0); | 1230 | resize(0); |
1309 | } | 1231 | } |
1310 | 1232 | ||
@@ -1314,7 +1236,7 @@ initui (void) | |||
1314 | Enable, when needed | 1236 | Enable, when needed |
1315 | 1237 | ||
1316 | static void | 1238 | static void |
1317 | writecolorized( WINDOW *win, unsigned char *string) { | 1239 | writecolorized( WINDOW *win, char *string) { |
1318 | ncurs_attr old_att, new_att; | 1240 | ncurs_attr old_att, new_att; |
1319 | int i; | 1241 | int i; |
1320 | 1242 | ||
@@ -1333,12 +1255,14 @@ writecolorized( WINDOW *win, unsigned char *string) { | |||
1333 | 1255 | ||
1334 | /* render consoleline to screen */ | 1256 | /* render consoleline to screen */ |
1335 | void | 1257 | void |
1336 | consoleline (unsigned char *message) | 1258 | consoleline (char *message) |
1337 | { | 1259 | { |
1338 | /* clear console, set string (or default), redraw display */ | 1260 | /* clear console, set string (or default), redraw display */ |
1339 | int i; | 1261 | int i; |
1340 | ncurs_attr old_att, new_att; | 1262 | ncurs_attr old_att, new_att; |
1341 | 1263 | ||
1264 | togglequery(); | ||
1265 | |||
1342 | memset( &new_att, 0, sizeof(new_att)); | 1266 | memset( &new_att, 0, sizeof(new_att)); |
1343 | BCOLR_SET( (&new_att), 8 ); | 1267 | BCOLR_SET( (&new_att), 8 ); |
1344 | wmove (console, 0, 0); | 1268 | wmove (console, 0, 0); |
@@ -1370,13 +1294,15 @@ consoleline (unsigned char *message) | |||
1370 | redrawwin(output); | 1294 | redrawwin(output); |
1371 | wnoutrefresh(output); | 1295 | wnoutrefresh(output); |
1372 | } | 1296 | } |
1297 | |||
1298 | togglequery(); | ||
1373 | wnoutrefresh(input); | 1299 | wnoutrefresh(input); |
1374 | doupdate(); | 1300 | doupdate(); |
1375 | } | 1301 | } |
1376 | 1302 | ||
1377 | /* render topicline to screen */ | 1303 | /* render topicline to screen */ |
1378 | void | 1304 | void |
1379 | topicline (unsigned char *message) | 1305 | topicline (char *message) |
1380 | { | 1306 | { |
1381 | int i; | 1307 | int i; |
1382 | ncurs_attr old_att, new_att; | 1308 | ncurs_attr old_att, new_att; |
@@ -1384,6 +1310,8 @@ topicline (unsigned char *message) | |||
1384 | if( !topic ) | 1310 | if( !topic ) |
1385 | return; | 1311 | return; |
1386 | 1312 | ||
1313 | togglequery(); | ||
1314 | |||
1387 | memset( &new_att, 0, sizeof(new_att)); | 1315 | memset( &new_att, 0, sizeof(new_att)); |
1388 | BCOLR_SET( (&new_att), 8 ); | 1316 | BCOLR_SET( (&new_att), 8 ); |
1389 | 1317 | ||
@@ -1409,6 +1337,8 @@ topicline (unsigned char *message) | |||
1409 | redrawwin(output); | 1337 | redrawwin(output); |
1410 | wnoutrefresh(output); | 1338 | wnoutrefresh(output); |
1411 | } | 1339 | } |
1340 | |||
1341 | togglequery(); | ||
1412 | wnoutrefresh(input); | 1342 | wnoutrefresh(input); |
1413 | doupdate(); | 1343 | doupdate(); |
1414 | } | 1344 | } |
@@ -1421,8 +1351,6 @@ exitui (void) | |||
1421 | rl_callback_handler_remove (); | 1351 | rl_callback_handler_remove (); |
1422 | endwin (); | 1352 | endwin (); |
1423 | ui_init = 0; | 1353 | ui_init = 0; |
1424 | if( vchat_logfile ) | ||
1425 | fclose( vchat_logfile ); | ||
1426 | } | 1354 | } |
1427 | } | 1355 | } |
1428 | 1356 | ||
@@ -1465,7 +1393,7 @@ static void | |||
1465 | vcnredraw (void) | 1393 | vcnredraw (void) |
1466 | { | 1394 | { |
1467 | int i; | 1395 | int i; |
1468 | unsigned char *passbof="-*-*-*-*-*-*-"; | 1396 | char *passbof="-*-*-*-*-*-*-"; |
1469 | 1397 | ||
1470 | /* wipe input line and reset cursor */ | 1398 | /* wipe input line and reset cursor */ |
1471 | wmove(input, 0, 0); | 1399 | wmove(input, 0, 0); |
@@ -1486,7 +1414,7 @@ int | |||
1486 | passprompt (char *buf, int size, int rwflag, void *userdata) | 1414 | passprompt (char *buf, int size, int rwflag, void *userdata) |
1487 | { | 1415 | { |
1488 | int i; | 1416 | int i; |
1489 | unsigned char *passphrase = NULL; | 1417 | char *passphrase = NULL; |
1490 | 1418 | ||
1491 | /* use special non-revealing redraw function */ | 1419 | /* use special non-revealing redraw function */ |
1492 | /* FIXME: passphrase isn't protected against e.g. swapping */ | 1420 | /* FIXME: passphrase isn't protected against e.g. swapping */ |
@@ -1619,7 +1547,7 @@ clearfilters( char colour ) { | |||
1619 | 1547 | ||
1620 | /* removes filter pattern */ | 1548 | /* removes filter pattern */ |
1621 | void | 1549 | void |
1622 | removefilter( unsigned char *tail ) { | 1550 | removefilter( char *tail ) { |
1623 | int rmv = 0, val; | 1551 | int rmv = 0, val; |
1624 | char* end; | 1552 | char* end; |
1625 | 1553 | ||
@@ -1627,8 +1555,8 @@ removefilter( unsigned char *tail ) { | |||
1627 | 1555 | ||
1628 | rmv = removefromfilterlist( test_simplerm, (void *)tail, 0 ); | 1556 | rmv = removefromfilterlist( test_simplerm, (void *)tail, 0 ); |
1629 | if(!rmv) { | 1557 | if(!rmv) { |
1630 | val = strtol((char*)tail, &end, 10); | 1558 | val = strtol(tail, &end, 10); |
1631 | if( (tail != (unsigned char*)end) && (!*end) ) | 1559 | if( (tail != end) && (!*end) ) |
1632 | rmv = removefromfilterlist( test_numericrm, (void *)val, 0); | 1560 | rmv = removefromfilterlist( test_numericrm, (void *)val, 0); |
1633 | } | 1561 | } |
1634 | 1562 | ||
@@ -1646,7 +1574,7 @@ static unsigned int uniqueidpool = 1; | |||
1646 | 1574 | ||
1647 | /* returns unique id for filter pattern or 0 for failure */ | 1575 | /* returns unique id for filter pattern or 0 for failure */ |
1648 | unsigned int | 1576 | unsigned int |
1649 | addfilter( char colour, unsigned char *regex ) { | 1577 | addfilter( char colour, char *regex ) { |
1650 | filt *newflt = malloc( sizeof(filt)), **flt = &filterlist; | 1578 | filt *newflt = malloc( sizeof(filt)), **flt = &filterlist; |
1651 | 1579 | ||
1652 | if( !newflt ) return 0; | 1580 | if( !newflt ) return 0; |
@@ -1753,3 +1681,31 @@ listfilters( void ) { | |||
1753 | } | 1681 | } |
1754 | showout(); | 1682 | showout(); |
1755 | } | 1683 | } |
1684 | |||
1685 | void | ||
1686 | handlequery( char *tail ) { | ||
1687 | if( *tail ) { | ||
1688 | // ".m %s " -> string + 4 | ||
1689 | if( querypartner && private ) { | ||
1690 | WINDOW *tmp= private; private = channel; channel = tmp; | ||
1691 | } | ||
1692 | querypartner = (char *)realloc( querypartner, 5 + strlen( tail )); | ||
1693 | if( querypartner ) { | ||
1694 | snprintf( querypartner, 5 + strlen( tail ), ".m %s ", tail ); | ||
1695 | if( private ) { | ||
1696 | WINDOW *tmp= private; private = channel; channel = tmp; | ||
1697 | } | ||
1698 | } | ||
1699 | resize( 0 ); | ||
1700 | } else { | ||
1701 | // QUERY ends | ||
1702 | if( querypartner ) { | ||
1703 | free( querypartner ); | ||
1704 | querypartner = NULL; | ||
1705 | if( private ) { | ||
1706 | WINDOW *tmp= private; private = channel; channel = tmp; | ||
1707 | } | ||
1708 | resize( 0 ); | ||
1709 | } | ||
1710 | } | ||
1711 | } | ||