aboutsummaryrefslogtreecommitdiffstats
path: root/libavdevice
diff options
context:
space:
mode:
authorLukasz Marek <lukasz.m.luki2@gmail.com>2014-05-27 22:57:26 +0200
committerMichael Niedermayer <michaelni@gmx.at>2014-06-30 19:20:32 +0200
commite5c806fd676ff7efbb683a7b3825dd16af3674f5 (patch)
tree7903b367df758c916e2ab08cdf09122231864c18 /libavdevice
parente429d6c1971db72195d84da2463859498cd030dc (diff)
downloadffmpeg-e5c806fd676ff7efbb683a7b3825dd16af3674f5.tar.gz
lavd/xv: handle delete window message
User may close X11 window by close button on tray. FFmpeg leaves in graceless way. This commit detects it and return EPIPE error. Signed-off-by: Lukasz Marek <lukasz.m.luki2@gmail.com> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavdevice')
-rw-r--r--libavdevice/xv.c16
1 files changed, 16 insertions, 0 deletions
diff --git a/libavdevice/xv.c b/libavdevice/xv.c
index d1f8907d99..71857e6b83 100644
--- a/libavdevice/xv.c
+++ b/libavdevice/xv.c
@@ -58,6 +58,7 @@ typedef struct {
int image_width, image_height;
XShmSegmentInfo yuv_shminfo;
int xv_port;
+ Atom wm_delete_message;
} XVContext;
typedef struct XVTagFormatMap
@@ -156,6 +157,8 @@ static int xv_write_header(AVFormatContext *s)
}
}
XStoreName(xv->display, xv->window, xv->window_title);
+ xv->wm_delete_message = XInternAtom(xv->display, "WM_DELETE_WINDOW", False);
+ XSetWMProtocols(xv->display, xv->window, &xv->wm_delete_message, 1);
XMapWindow(xv->display, xv->window);
} else
xv->window = xv->window_id;
@@ -297,6 +300,19 @@ static int write_picture(AVFormatContext *s, AVPicture *pict)
img->data + img->offsets[1],
img->data + img->offsets[2]
};
+
+ /* Check messages. Window might get closed. */
+ if (!xv->window_id) {
+ XEvent event;
+ while (XPending(xv->display)) {
+ XNextEvent(xv->display, &event);
+ if (event.type == ClientMessage && event.xclient.data.l[0] == xv->wm_delete_message)
+ av_log(xv, AV_LOG_DEBUG, "Window close event.\n");
+ return AVERROR(EPIPE);
+ }
+ }
+ }
+
av_image_copy(data, img->pitches, (const uint8_t **)pict->data, pict->linesize,
xv->image_format, img->width, img->height);
return xv_repaint(s);