- Timestamp:
- Feb 18, 2008, 9:07:22 PM (17 years ago)
- Branches:
- master, barnowl_perlaim, debian, release-1.10, release-1.4, release-1.5, release-1.6, release-1.7, release-1.8, release-1.9
- Children:
- b70d24f
- Parents:
- 680ed23 (diff), 9d2f010 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
owl.c
r625802a r5f3168a 46 46 #include <sys/param.h> 47 47 #include <sys/types.h> 48 #include <sys/time.h> 48 49 #include <termios.h> 49 50 #include <sys/stat.h> … … 61 62 #endif 62 63 64 #define STDIN 0 65 63 66 static const char fileIdent[] = "$Id$"; 64 67 … … 71 74 owl_popwin *pw; 72 75 int ret, initialsubs, debug, argcsave, followlast; 73 owl_input j;74 76 int newmsgs, nexttimediff; 75 77 struct sigaction sigact; … … 214 216 owl_global_set_haveaim(&g); 215 217 218 /* prepare stdin dispatch */ 219 { 220 owl_dispatch *d = owl_malloc(sizeof(owl_dispatch)); 221 d->fd = STDIN; 222 d->cfunc = &owl_process_input; 223 d->pfunc = NULL; 224 owl_select_add_dispatch(d); 225 } 226 216 227 #ifdef HAVE_LIBZEPHYR 217 228 /* zephyr init */ 218 229 ret=owl_zephyr_initialize(); 219 if (!ret) 220 owl_global_set_havezephyr(&g); 230 if (!ret) { 231 owl_dispatch *d = owl_malloc(sizeof(owl_dispatch)); 232 d->fd = ZGetFD(); 233 d->cfunc = &owl_zephyr_process_events; 234 d->pfunc = NULL; 235 owl_select_add_dispatch(d); 236 owl_global_set_havezephyr(&g); 237 } 238 221 239 #endif 222 240 … … 433 451 followlast=owl_global_should_followlast(&g); 434 452 435 /* Do AIM stuff */436 if (owl_global_is_doaimevents(&g)) {437 owl_aim_process_events();438 439 if (owl_global_is_aimloggedin(&g)) {440 if (owl_timer_is_expired(owl_global_get_aim_buddyinfo_timer(&g))) {441 /* owl_buddylist_request_idletimes(owl_global_get_buddylist(&g)); */442 owl_timer_reset(owl_global_get_aim_buddyinfo_timer(&g));443 }444 }445 }446 447 453 owl_perlconfig_mainloop(); 448 454 … … 462 468 } 463 469 464 owl_zephyr_process_events();465 466 470 /* Grab incoming messages. */ 467 471 newmsgs=0; … … 535 539 } 536 540 537 /* Handle all keypresses. If no key has been pressed, sleep for a 538 * little bit, but otherwise do not. This lets input be grabbed 539 * as quickly as possbile */ 540 j.ch = wgetch(typwin); 541 if (j.ch == ERR) { 542 usleep(10000); 543 } else { 544 j.uch = '\0'; 545 if (j.ch >= KEY_MIN && j.ch <= KEY_MAX) { 546 /* This is a curses control character. */ 547 } 548 else if (j.ch > 0x7f && j.ch < 0xfe) { 549 /* Pull in a full utf-8 character. */ 550 int bytes, i; 551 char utf8buf[7]; 552 memset(utf8buf, '\0', 7); 553 554 utf8buf[0] = j.ch; 555 556 if ((j.ch & 0xc0) && (~j.ch & 0x20)) bytes = 2; 557 else if ((j.ch & 0xe0) && (~j.ch & 0x10)) bytes = 3; 558 else if ((j.ch & 0xf0) && (~j.ch & 0x08)) bytes = 4; 559 else if ((j.ch & 0xf8) && (~j.ch & 0x04)) bytes = 5; 560 else if ((j.ch & 0xfc) && (~j.ch & 0x02)) bytes = 6; 561 else bytes = 1; 562 563 for (i = 1; i < bytes; i++) { 564 int tmp = wgetch(typwin); 565 /* If what we got was not a byte, or not a continuation byte */ 566 if (tmp > 0xff || !(tmp & 0x80 && ~tmp & 0x40)) { 567 /* ill-formed UTF-8 code unit subsequence, put back the 568 char we just got. */ 569 ungetch(tmp); 570 j.ch = ERR; 571 break; 572 } 573 utf8buf[i] = tmp; 574 } 575 576 if (j.ch != ERR) { 577 if (g_utf8_validate(utf8buf, -1, NULL)) { 578 j.uch = g_utf8_get_char(utf8buf); 579 } 580 else { 581 j.ch = ERR; 582 } 583 } 584 } 585 else if (j.ch <= 0x7f) { 586 j.uch = j.ch; 587 } 588 589 owl_global_set_lastinputtime(&g, now); 590 /* find and activate the current keymap. 591 * TODO: this should really get fixed by activating 592 * keymaps as we switch between windows... 593 */ 594 if (pw && owl_popwin_is_active(pw) && owl_global_get_viewwin(&g)) { 595 owl_context_set_popless(owl_global_get_context(&g), 596 owl_global_get_viewwin(&g)); 597 owl_function_activate_keymap("popless"); 598 } else if (owl_global_is_typwin_active(&g) 599 && owl_editwin_get_style(tw)==OWL_EDITWIN_STYLE_ONELINE) { 600 /* 601 owl_context_set_editline(owl_global_get_context(&g), tw); 602 owl_function_activate_keymap("editline"); 603 */ 604 } else if (owl_global_is_typwin_active(&g) 605 && owl_editwin_get_style(tw)==OWL_EDITWIN_STYLE_MULTILINE) { 606 owl_context_set_editmulti(owl_global_get_context(&g), tw); 607 owl_function_activate_keymap("editmulti"); 608 } else { 609 owl_context_set_recv(owl_global_get_context(&g)); 610 owl_function_activate_keymap("recv"); 611 } 612 /* now actually handle the keypress */ 613 ret = owl_keyhandler_process(owl_global_get_keyhandler(&g), j); 614 if (ret!=0 && ret!=1) { 615 owl_function_makemsg("Unable to handle keypress"); 616 } 617 } 541 /* select on FDs we know about. */ 542 owl_select(); 618 543 619 544 /* Log any error signals */ … … 733 658 } 734 659 660 void owl_process_aim() 661 { 662 if (owl_global_is_doaimevents(&g)) { 663 owl_aim_process_events(); 664 665 if (owl_global_is_aimloggedin(&g)) { 666 if (owl_timer_is_expired(owl_global_get_aim_buddyinfo_timer(&g))) { 667 /* owl_buddylist_request_idletimes(owl_global_get_buddylist(&g)); */ 668 owl_timer_reset(owl_global_get_aim_buddyinfo_timer(&g)); 669 } 670 } 671 } 672 } 673 674 void owl_process_input() 675 { 676 int ret; 677 owl_input j; 678 owl_popwin *pw; 679 owl_editwin *tw; 680 WINDOW *typwin; 681 682 typwin = owl_global_get_curs_typwin(&g); 683 j.ch = wgetch(typwin); 684 if (j.ch == ERR) return; 685 686 owl_global_set_lastinputtime(&g, time(NULL)); 687 pw=owl_global_get_popwin(&g); 688 tw=owl_global_get_typwin(&g); 689 690 j.uch = '\0'; 691 if (j.ch >= KEY_MIN && j.ch <= KEY_MAX) { 692 /* This is a curses control character. */ 693 } 694 else if (j.ch > 0x7f && j.ch < 0xfe) { 695 /* Pull in a full utf-8 character. */ 696 int bytes, i; 697 char utf8buf[7]; 698 memset(utf8buf, '\0', 7); 699 700 utf8buf[0] = j.ch; 701 702 if ((j.ch & 0xc0) && (~j.ch & 0x20)) bytes = 2; 703 else if ((j.ch & 0xe0) && (~j.ch & 0x10)) bytes = 3; 704 else if ((j.ch & 0xf0) && (~j.ch & 0x08)) bytes = 4; 705 else if ((j.ch & 0xf8) && (~j.ch & 0x04)) bytes = 5; 706 else if ((j.ch & 0xfc) && (~j.ch & 0x02)) bytes = 6; 707 else bytes = 1; 708 709 for (i = 1; i < bytes; i++) { 710 int tmp = wgetch(typwin); 711 /* If what we got was not a byte, or not a continuation byte */ 712 if (tmp > 0xff || !(tmp & 0x80 && ~tmp & 0x40)) { 713 /* ill-formed UTF-8 code unit subsequence, put back the 714 char we just got. */ 715 ungetch(tmp); 716 j.ch = ERR; 717 break; 718 } 719 utf8buf[i] = tmp; 720 } 721 722 if (j.ch != ERR) { 723 if (g_utf8_validate(utf8buf, -1, NULL)) { 724 j.uch = g_utf8_get_char(utf8buf); 725 } 726 else { 727 j.ch = ERR; 728 } 729 } 730 } 731 else if (j.ch <= 0x7f) { 732 j.uch = j.ch; 733 } 734 735 owl_global_set_lastinputtime(&g, time(NULL)); 736 /* find and activate the current keymap. 737 * TODO: this should really get fixed by activating 738 * keymaps as we switch between windows... 739 */ 740 if (pw && owl_popwin_is_active(pw) && owl_global_get_viewwin(&g)) { 741 owl_context_set_popless(owl_global_get_context(&g), 742 owl_global_get_viewwin(&g)); 743 owl_function_activate_keymap("popless"); 744 } else if (owl_global_is_typwin_active(&g) 745 && owl_editwin_get_style(tw)==OWL_EDITWIN_STYLE_ONELINE) { 746 /* 747 owl_context_set_editline(owl_global_get_context(&g), tw); 748 owl_function_activate_keymap("editline"); 749 */ 750 } else if (owl_global_is_typwin_active(&g) 751 && owl_editwin_get_style(tw)==OWL_EDITWIN_STYLE_MULTILINE) { 752 owl_context_set_editmulti(owl_global_get_context(&g), tw); 753 owl_function_activate_keymap("editmulti"); 754 } else { 755 owl_context_set_recv(owl_global_get_context(&g)); 756 owl_function_activate_keymap("recv"); 757 } 758 /* now actually handle the keypress */ 759 ret = owl_keyhandler_process(owl_global_get_keyhandler(&g), j); 760 if (ret!=0 && ret!=1) { 761 owl_function_makemsg("Unable to handle keypress"); 762 } 763 } 764 735 765 void sig_handler(int sig, siginfo_t *si, void *data) 736 766 { … … 747 777 owl_function_quit(); 748 778 } 749 750 779 } 751 780
Note: See TracChangeset
for help on using the changeset viewer.