diff options
author | Ander Conselvan de Oliveira <ander.conselvan.de.oliveira@intel.com> | 2013-12-18 19:51:39 +0200 |
---|---|---|
committer | Kristian Høgsberg <krh@bitplanet.net> | 2013-12-19 21:49:18 -0800 |
commit | 41b829c025fb92d601e2a41468a2f281e3c8731e (patch) | |
tree | f236335fb7e727b1107d00ba6c52d460ec12a630 | |
parent | df42a80ea2ac7ce837d0d058ceb96964ba6e471d (diff) |
screenshooter: Choose output to record from based on keyboard focus
Record from the output of the surface that has keyboard focus for the
seat used to activate the recorder key binding. If there is no focused
surface, record from the first one.
Also, use the weston_transformed_region() to transform the damage
region of the output into the coordinates expected by read_pixels().
https://bugs.freedesktop.org/show_bug.cgi?id=71401
-rw-r--r-- | src/screenshooter.c | 96 |
1 files changed, 29 insertions, 67 deletions
diff --git a/src/screenshooter.c b/src/screenshooter.c index 2d05ad61..0489f92f 100644 --- a/src/screenshooter.c +++ b/src/screenshooter.c @@ -302,60 +302,6 @@ component_delta(uint32_t next, uint32_t prev) } static void -transform_rect(struct weston_output *output, pixman_box32_t *r) -{ - pixman_box32_t s = *r; - - switch (output->transform) { - case WL_OUTPUT_TRANSFORM_FLIPPED: - case WL_OUTPUT_TRANSFORM_FLIPPED_90: - case WL_OUTPUT_TRANSFORM_FLIPPED_180: - case WL_OUTPUT_TRANSFORM_FLIPPED_270: - s.x1 = output->width - r->x2; - s.x2 = output->width - r->x1; - break; - default: - break; - } - - switch (output->transform) { - case WL_OUTPUT_TRANSFORM_NORMAL: - case WL_OUTPUT_TRANSFORM_FLIPPED: - r->x1 = s.x1; - r->x2 = s.x2; - break; - case WL_OUTPUT_TRANSFORM_90: - case WL_OUTPUT_TRANSFORM_FLIPPED_90: - r->x1 = output->current_mode->width - s.y2; - r->y1 = s.x1; - r->x2 = output->current_mode->width - s.y1; - r->y2 = s.x2; - break; - case WL_OUTPUT_TRANSFORM_180: - case WL_OUTPUT_TRANSFORM_FLIPPED_180: - r->x1 = output->current_mode->width - s.x2; - r->y1 = output->current_mode->height - s.y2; - r->x2 = output->current_mode->width - s.x1; - r->y2 = output->current_mode->height - s.y1; - break; - case WL_OUTPUT_TRANSFORM_270: - case WL_OUTPUT_TRANSFORM_FLIPPED_270: - r->x1 = s.y1; - r->y1 = output->current_mode->height - s.x2; - r->x2 = s.y2; - r->y2 = output->current_mode->height - s.x1; - break; - default: - break; - } - - r->x1 *= output->current_scale; - r->y1 *= output->current_scale; - r->x2 *= output->current_scale; - r->y2 *= output->current_scale; -} - -static void weston_recorder_destroy(struct weston_recorder *recorder); static void @@ -367,7 +313,7 @@ weston_recorder_frame_notify(struct wl_listener *listener, void *data) struct weston_compositor *compositor = output->compositor; uint32_t msecs = output->frame_time; pixman_box32_t *r; - pixman_region32_t damage; + pixman_region32_t damage, transformed_damage; int i, j, k, n, width, height, run, stride; uint32_t delta, prev, *d, *s, *p, next; struct { @@ -386,15 +332,20 @@ weston_recorder_frame_notify(struct wl_listener *listener, void *data) outbuf = recorder->tmpbuf; pixman_region32_init(&damage); + pixman_region32_init(&transformed_damage); pixman_region32_intersect(&damage, &output->region, &output->previous_damage); + pixman_region32_translate(&damage, -output->x, -output->y); + weston_transformed_region(output->width, output->height, + output->transform, output->current_scale, + &damage, &transformed_damage); + pixman_region32_fini(&damage); - r = pixman_region32_rectangles(&damage, &n); - if (n == 0) + r = pixman_region32_rectangles(&transformed_damage, &n); + if (n == 0) { + pixman_region32_fini(&transformed_damage); return; - - for (i = 0; i < n; i++) - transform_rect(output, &r[i]); + } header.msecs = msecs; header.nrects = n; @@ -457,7 +408,7 @@ weston_recorder_frame_notify(struct wl_listener *listener, void *data) #endif } - pixman_region32_fini(&damage); + pixman_region32_fini(&transformed_damage); recorder->count++; if (recorder->destroying) @@ -543,15 +494,18 @@ recorder_binding(struct weston_seat *seat, uint32_t time, uint32_t key, void *da { struct weston_seat *ws = (struct weston_seat *) seat; struct weston_compositor *ec = ws->compositor; - struct weston_output *output = - container_of(ec->output_list.next, - struct weston_output, link); + struct weston_output *output; struct wl_listener *listener; struct weston_recorder *recorder; static const char filename[] = "capture.wcap"; - listener = wl_signal_get(&output->frame_signal, - weston_recorder_frame_notify); + wl_list_for_each(output, &seat->compositor->output_list, link) { + listener = wl_signal_get(&output->frame_signal, + weston_recorder_frame_notify); + if (listener) + break; + } + if (listener) { recorder = container_of(listener, struct weston_recorder, frame_listener); @@ -563,7 +517,15 @@ recorder_binding(struct weston_seat *seat, uint32_t time, uint32_t key, void *da recorder->destroying = 1; weston_output_schedule_repaint(recorder->output); } else { - weston_log("starting recorder, file %s\n", filename); + if (seat->keyboard && seat->keyboard->focus && + seat->keyboard->focus->output) + output = seat->keyboard->focus->output; + else + output = container_of(ec->output_list.next, + struct weston_output, link); + + weston_log("starting recorder for output %s, file %s\n", + output->name, filename); weston_recorder_create(output, filename); } } |