Esempio n. 1
0
bool me::WindowManager::handle(MirEvent const& event)
{
    assert(focus_controller);
    assert(display);
    assert(compositor);

    if (mir_event_get_type(&event) != mir_event_type_input)
        return false;
    auto iev = mir_event_get_input_event(&event);
    auto input_type = mir_input_event_get_type(iev);
    
    if (input_type == mir_input_event_type_key)
    {
        return handle_key_event(mir_input_event_get_keyboard_event(iev));
    }
    else if (input_type == mir_input_event_type_pointer &&
             focus_controller)
    {
        return handle_pointer_event(mir_input_event_get_pointer_event(iev));
    }
    else if (input_type == mir_input_event_type_touch &&
             focus_controller)
    {
        return handle_touch_event(mir_input_event_get_touch_event(iev));
    }


    return false;
}
Esempio n. 2
0
// Currently we only validate touch events as they are the most problematic
void mi::Validator::validate_and_dispatch(MirEvent const& event)
{
    if (mir_event_get_type(&event) != mir_event_type_input)
    {
        dispatch_valid_event(event);
        return;
    }
    auto iev = mir_event_get_input_event(&event);
    if (mir_input_event_get_type(iev) != mir_input_event_type_touch)
    {
        dispatch_valid_event(event);
        return;
    }
    auto tev = mir_input_event_get_touch_event(iev);
    handle_touch_event(mir_input_event_get_device_id(iev), tev);

    return;
}
Esempio n. 3
0
static periph_ep_resp_t
tcz_touchdata_filter (periph_t*         per,
                      periph_ep_ctrl_t* epc,
                      periph_ep_data_t* epd,
                      void*             user)
{
  // passive if USB not selected
  if (ts_data->type != EE_TS_TYPE_AUTO && ts_data->type != EE_TS_TYPE_USB)
    return periph_ep_send;

  if (*(epd->data) == ':')
  {
  	tcz_response_data_t* cr = (tcz_response_data_t *)(epd->data);

  	switch (cr->opcode)
  	{
  		case 0x49 :
			  //printf ("TCZ RESPONSE: Heartbeat\n");
  			break;
			default :
				printf ("unknown opcode (%02X)\n", cr->opcode);
				break;
  	}
  }
  else
  {
    int hit = TS_HIT_NONE;

  	uint16_t x, y;
    uint16_t hit_x, hit_y;
  	uint8_t touch;

  	tcz_coord_data_t* cd = (tcz_coord_data_t *)(epd->data);
  	x = CDGETW(cd->x); y = CDGETW(cd->y);

    #if 0  	
      //if ((cd->status & (1<<6)) == 0)
    	  printf ("TCZ COORD: status:%02x x=%d y=%d\n",
    	          cd->status, x, y);
   #endif
	          
    // Note : Zytronics coordinates are 1024x768
    //        - Sentinel is expecting 16384x16384
	  x = x << 4;
	  y = y * 16384.0/768.0 + 0.5;

    // - sentinel packets are handled inside
    // - we only need to decide whether to pass up-stream or not
    touch = cd->status & ((1<<7)|(1<<6));
    if ((hit = handle_touch_event (touch, x, y, &hit_x, &hit_y)) != TS_HIT_EGM)
      return (periph_ep_drop);

    // rescale to 1024x768
    hit_x >>= 4;
    hit_y = hit_y * 768.0/16384.0 + 0.5;
    // patch upstream packet
    cd->x[0] = hit_x & 0x7F;
    cd->x[1] = (hit_x >> 7) & 0x7F;
    cd->y[0] = hit_y & 0x7F;
    cd->y[1] = (hit_y >> 7) & 0x7F;
  }
  	
  return periph_ep_send;
}
Esempio n. 4
0
static void
gdk_mir_event_source_queue_event (GdkDisplay     *display,
                                  GdkWindow      *window,
                                  const MirEvent *event)
{
  const MirInputEvent *input_event;

  // FIXME: Only generate events if the window wanted them?
  switch (mir_event_get_type (event))
    {
    case mir_event_type_input:
      input_event = mir_event_get_input_event (event);

      switch (mir_input_event_get_type (input_event))
        {
        case mir_input_event_type_key:
          handle_key_event (window, input_event);
          break;
        case mir_input_event_type_touch:
          handle_touch_event (window, mir_input_event_get_touch_event (input_event));
          break;
        case mir_input_event_type_pointer:
          handle_motion_event (window, input_event);
          break;
        default:
          break;
        }

      break;
    case mir_event_type_key:
      handle_key_event (window, mir_event_get_input_event (event));
      break;
    case mir_event_type_motion:
      handle_motion_event (window, mir_event_get_input_event (event));
      break;
    case mir_event_type_window:
      handle_window_event (window, mir_event_get_window_event (event));
      break;
    case mir_event_type_resize:
      handle_resize_event (window, mir_event_get_resize_event (event));
      break;
    case mir_event_type_prompt_session_state_change:
      break;
    case mir_event_type_orientation:
      break;
    case mir_event_type_close_window:
      handle_close_event (window);
      break;
    case mir_event_type_keymap:
      break;
    case mir_event_type_window_output:
      handle_window_output_event (window, mir_event_get_window_output_event (event));
      break;
    case mir_event_type_input_device_state:
      break;
    case mir_event_type_window_placement:
      handle_window_placement_event (window, mir_event_get_window_placement_event (event));
      break;
    default:
      g_warning ("Ignoring unknown Mir event %d", mir_event_get_type (event));
      break;
    }
}