static int weston_timeline_do_open(void) { const char *prefix = "weston-timeline-"; const char *suffix = ".log"; char fname[1000]; timeline_.file = file_create_dated(prefix, suffix, fname, sizeof(fname)); if (!timeline_.file) { const char *msg; switch (errno) { case ETIME: msg = "failure in datetime formatting"; break; default: msg = strerror(errno); } weston_log("Cannot open '%s*%s' for writing: %s\n", prefix, suffix, msg); return -1; } weston_log("Opened timeline file '%s'\n", fname); return 0; }
static void trigger_binding(struct weston_keyboard *keyboard, const struct timespec *time, uint32_t key, void *data) { const char *prefix = "surfaceshot-"; const char *suffix = ".pam"; char fname[1024]; struct weston_surface *surface; struct weston_seat *seat = keyboard->seat; struct weston_pointer *pointer = weston_seat_get_pointer(seat); int width, height; char desc[512]; void *pixels; const size_t bytespp = 4; /* PIXMAN_a8b8g8r8 */ size_t sz; int ret; FILE *fp; if (!pointer || !pointer->focus) return; surface = pointer->focus->surface; weston_surface_get_content_size(surface, &width, &height); if (!surface->get_label || surface->get_label(surface, desc, sizeof(desc)) < 0) snprintf(desc, sizeof(desc), "(unknown)"); weston_log("surface screenshot of %p: '%s', %dx%d\n", surface, desc, width, height); sz = width * bytespp * height; if (sz == 0) { weston_log("no content for %p\n", surface); return; } pixels = malloc(sz); if (!pixels) { weston_log("%s: failed to malloc %zu B\n", __func__, sz); return; } ret = weston_surface_copy_content(surface, pixels, sz, 0, 0, width, height); if (ret < 0) { weston_log("shooting surface %p failed\n", surface); goto out; } unpremultiply_and_swap_a8b8g8r8_to_PAMrgba(pixels, sz); fp = file_create_dated(NULL, prefix, suffix, fname, sizeof(fname)); if (!fp) { const char *msg; switch (errno) { case ETIME: msg = "failure in datetime formatting"; break; default: msg = strerror(errno); } weston_log("Cannot open '%s*%s' for writing: %s\n", prefix, suffix, msg); goto out; } ret = write_PAM_image_rgba(fp, width, height, pixels, sz, desc); if (fclose(fp) != 0 || ret < 0) weston_log("writing surface %p screenshot failed.\n", surface); else weston_log("successfully shot surface %p into '%s'\n", surface, fname); out: free(pixels); }