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; }
// 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; }
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; }
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; } }