--- libgeis/backend/grail/geis_grail_backend.c +++ libgeis/backend/grail/geis_grail_backend.c @@ -203,7 +203,19 @@ GEIS_ATTR_TYPE_STRING, "n/a")); - geis_frame_set_matrix(frame, &(*C)[0][0]); + // grail gives us a 3x3 matrix but geis_frame_set_matrix expects a + // 4x4 matrix, so we need to convert this. + GeisFloat D[16]; + memset(D, 0, sizeof(D)); + // We fill the left upper 3x3 submatrix of our 4x4 matrix. + for (unsigned int col = 0; col < 3; ++col) + for (unsigned int row = 0; row < 3; ++row) + D[4 * row + col] = (*C)[row][col]; + // As usual for transformation matrices, the lower right entry needs + // to be 1. + D[15] = 1; + + geis_frame_set_matrix(frame, D); if (ugmask & UGGestureTypeDrag) { geis_frame_set_is_class(frame, gbe->drag_class);