diff options
author | Lukasz Marek <lukasz.m.luki2@gmail.com> | 2014-05-27 22:57:26 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-06-30 19:20:32 +0200 |
commit | e5c806fd676ff7efbb683a7b3825dd16af3674f5 (patch) | |
tree | 7903b367df758c916e2ab08cdf09122231864c18 /libavdevice | |
parent | e429d6c1971db72195d84da2463859498cd030dc (diff) | |
download | ffmpeg-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.c | 16 |
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); |