static RutInputEventStatus _rut_button_grab_input_cb (RutInputEvent *event, void *user_data) { ButtonGrabState *state = user_data; RutButton *button = state->button; if(rut_input_event_get_type (event) == RUT_INPUT_EVENT_TYPE_MOTION) { RutShell *shell = button->ctx->shell; if (rut_motion_event_get_action (event) == RUT_MOTION_EVENT_ACTION_UP) { rut_shell_ungrab_input (shell, _rut_button_grab_input_cb, user_data); rut_closure_list_invoke (&button->on_click_cb_list, RutButtonClickCallback, button); g_slice_free (ButtonGrabState, state); button->state = BUTTON_STATE_NORMAL; rut_shell_queue_redraw (button->ctx->shell); return RUT_INPUT_EVENT_STATUS_HANDLED; } else if (rut_motion_event_get_action (event) == RUT_MOTION_EVENT_ACTION_MOVE) { float x = rut_motion_event_get_x (event); float y = rut_motion_event_get_y (event); RutCamera *camera = state->camera; rut_camera_unproject_coord (camera, &state->transform, &state->inverse_transform, 0, &x, &y); if (x < 0 || x > button->width || y < 0 || y > button->height) button->state = BUTTON_STATE_ACTIVE_CANCEL; else button->state = BUTTON_STATE_ACTIVE; rut_shell_queue_redraw (button->ctx->shell); return RUT_INPUT_EVENT_STATUS_HANDLED; } } return RUT_INPUT_EVENT_STATUS_UNHANDLED; }
bool map_window_coords_to_overlay_coord (RutCamera *camera, /* 2d ui camera */ RutObject *overlay, /* camera-view overlay */ float *x, float *y) { CoglMatrix transform; CoglMatrix inverse_transform; rut_graphable_get_modelview (overlay, camera, &transform); if (!cogl_matrix_get_inverse (&transform, &inverse_transform)) return FALSE; rut_camera_unproject_coord (camera, &transform, &inverse_transform, 0, /* object_coord_z */ x, y); return TRUE; }
bool map_window_coords_to_overlay_coord(rut_object_t *camera, /* 2d ui camera */ rut_object_t *overlay, /* camera-view overlay */ float *x, float *y) { c_matrix_t transform; c_matrix_t inverse_transform; rut_graphable_get_modelview(overlay, camera, &transform); if (!c_matrix_get_inverse(&transform, &inverse_transform)) return false; rut_camera_unproject_coord(camera, &transform, &inverse_transform, 0, /* object_coord_z */ x, y); return true; }