Пример #1
0
int
w32_console_read_socket (struct terminal *terminal,
                         struct input_event *hold_quit)
{
  int nev, add;
  int isdead;

  block_input ();

  for (;;)
    {
      nev = fill_queue (0);
      if (nev <= 0)
        {
	  /* If nev == -1, there was some kind of error
	     If nev == 0 then waitp must be zero and no events were available
	     so return.  */
	  break;
        }

      while (nev > 0)
        {
	  struct input_event inev;

	  EVENT_INIT (inev);
	  inev.kind = NO_EVENT;
	  inev.arg = Qnil;

	  switch (queue_ptr->EventType)
            {
            case KEY_EVENT:
	      add = key_event (&queue_ptr->Event.KeyEvent, &inev, &isdead);
	      if (add == -1) /* 95.7.25 by himi */
		{
		  queue_ptr--;
		  add = 1;
		}
	      if (add)
		kbd_buffer_store_event_hold (&inev, hold_quit);
	      break;

            case MOUSE_EVENT:
	      add = do_mouse_event (&queue_ptr->Event.MouseEvent, &inev);
	      if (add)
		kbd_buffer_store_event_hold (&inev, hold_quit);
	      break;

            case WINDOW_BUFFER_SIZE_EVENT:
	      if (w32_use_full_screen_buffer)
		resize_event (&queue_ptr->Event.WindowBufferSizeEvent);
	      break;

            case MENU_EVENT:
            case FOCUS_EVENT:
	      /* Internal event types, ignored. */
	      break;
            }

	  queue_ptr++;
	  nev--;
        }
    }

  /* We don't get told about changes in the window size (only the buffer
     size, which we no longer care about), so we have to check it
     periodically.  */
  if (!w32_use_full_screen_buffer)
    maybe_generate_resize_event ();

  unblock_input ();
  return nev;
}
Пример #2
0
int
w32_console_read_socket (struct terminal *terminal,
                         struct input_event *hold_quit)
{
    int nev, add;
    int isdead;

    block_input ();

    for (;;)
    {
        int nfnotify = handle_file_notifications (hold_quit);

        nev = fill_queue (0);
        if (nev <= 0)
        {
            /* If nev == -1, there was some kind of error
               If nev == 0 then no events were available
               so return.  */
            if (nfnotify)
                nev = 0;
            break;
        }

        while (nev > 0)
        {
            struct input_event inev;
            /* Having a separate variable with this value makes
               debugging easier, as otherwise the compiler might
               rearrange the switch below in a way that makes it hard to
               track the event type.  */
            unsigned evtype = queue_ptr->EventType;

            EVENT_INIT (inev);
            inev.kind = NO_EVENT;
            inev.arg = Qnil;

            switch (evtype)
            {
            case KEY_EVENT:
                add = key_event (&queue_ptr->Event.KeyEvent, &inev, &isdead);
                if (add == -1) /* 95.7.25 by himi */
                {
                    queue_ptr--;
                    add = 1;
                }
                if (add)
                    kbd_buffer_store_event_hold (&inev, hold_quit);
                break;

            case MOUSE_EVENT:
                add = do_mouse_event (&queue_ptr->Event.MouseEvent, &inev);
                if (add)
                    kbd_buffer_store_event_hold (&inev, hold_quit);
                break;

            case WINDOW_BUFFER_SIZE_EVENT:
                if (w32_use_full_screen_buffer)
                    resize_event (&queue_ptr->Event.WindowBufferSizeEvent);
                break;

            case MENU_EVENT:
            case FOCUS_EVENT:
                /* Internal event types, ignored. */
                break;
            }

            queue_ptr++;
            nev--;
        }
    }

    /* We don't get told about changes in the window size (only the buffer
       size, which we no longer care about), so we have to check it
       periodically.  */
    if (!w32_use_full_screen_buffer)
        maybe_generate_resize_event ();

    unblock_input ();
    return nev;
}