Changeset 5f3168a for owl.c


Ignore:
Timestamp:
Feb 18, 2008, 9:07:22 PM (13 years ago)
Author:
Alejandro R. Sedeño <asedeno@mit.edu>
Branches:
master, barnowl_perlaim, debian, 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.
Message:
Merged revisions 928-950 via svnmerge from 
file:///afs/sipb.mit.edu/project/barnowl/src/svn/trunk

........
  r937 | nelhage | 2008-02-11 23:09:54 -0500 (Mon, 11 Feb 2008) | 2 lines
  
  Bind M-left and M-right by default in the editor
........
  r947 | nelhage | 2008-02-18 16:45:22 -0500 (Mon, 18 Feb 2008) | 2 lines
  
  We need to stick modules on the beginning of @INC, not the end
........
  r949 | asedeno | 2008-02-18 19:43:09 -0500 (Mon, 18 Feb 2008) | 1 line
  
  Merging in the select branch.
........
  r950 | asedeno | 2008-02-18 20:54:45 -0500 (Mon, 18 Feb 2008) | 1 line
  
  Merging in the select branch, part 2. select.c
........
File:
1 edited

Legend:

Unmodified
Added
Removed
  • owl.c

    r625802a r5f3168a  
    4646#include <sys/param.h>
    4747#include <sys/types.h>
     48#include <sys/time.h>
    4849#include <termios.h>
    4950#include <sys/stat.h>
     
    6162#endif
    6263
     64#define STDIN 0
     65
    6366static const char fileIdent[] = "$Id$";
    6467
     
    7174  owl_popwin *pw;
    7275  int ret, initialsubs, debug, argcsave, followlast;
    73   owl_input j;
    7476  int newmsgs, nexttimediff;
    7577  struct sigaction sigact;
     
    214216  owl_global_set_haveaim(&g);
    215217
     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 
    216227#ifdef HAVE_LIBZEPHYR
    217228  /* zephyr init */
    218229  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
    221239#endif
    222240
     
    433451    followlast=owl_global_should_followlast(&g);
    434452   
    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 
    447453    owl_perlconfig_mainloop();
    448454
     
    462468    }
    463469
    464     owl_zephyr_process_events();
    465    
    466470    /* Grab incoming messages. */
    467471    newmsgs=0;
     
    535539    }
    536540
    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();
    618543
    619544    /* Log any error signals */
     
    733658}
    734659
     660void 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
     674void 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
    735765void sig_handler(int sig, siginfo_t *si, void *data)
    736766{
     
    747777    owl_function_quit();
    748778  }
    749 
    750779}
    751780
Note: See TracChangeset for help on using the changeset viewer.