Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
756d45e414 | ||
|
|
1cfa0a69ac | ||
|
|
dea583410c | ||
|
|
568ab3672a | ||
|
|
0dd66b8b2c | ||
|
|
31a5fe6fa8 | ||
|
|
36fe16cc7e | ||
|
|
c52ca90492 | ||
|
|
939d34e8f1 | ||
|
|
bb2238516b | ||
|
|
ab816f1ab1 | ||
|
|
7b8d360288 | ||
|
|
3394072795 | ||
|
|
4adcbe4d9c | ||
|
|
b3a0557bc8 | ||
|
|
15dd1d1f8d | ||
|
|
94cf61e9b8 | ||
|
|
dc83660175 | ||
|
|
11602fd31a | ||
|
|
7973487a4c | ||
|
|
c2ba42e02d | ||
|
|
1b8affee0e | ||
|
|
0f1a871d65 | ||
|
|
2e5610c23a | ||
|
|
c472782c3e | ||
|
|
601c285d83 | ||
|
|
b950afb6ea | ||
|
|
3ed671e369 |
No files matched your search
+1
-1
@@ -438,7 +438,7 @@ Available filters are:
|
||||
|
||||
``drc[=method:target]``
|
||||
Applies dynamic range compression. This maximizes the volume by compressing
|
||||
the audio signal's dynamic range.
|
||||
the audio signal's dynamic range. (Formerly called ``volnorm``.)
|
||||
|
||||
``<method>``
|
||||
Sets the used method.
|
||||
|
||||
@@ -169,6 +169,7 @@ Command Line Switches
|
||||
``--mixer`` AO suboptions (``alsa``, ``oss``)
|
||||
``--mixer-channel`` AO suboptions (``alsa``, ``oss``)
|
||||
``--ao=alsa:device=hw=0.3`` ``--ao=alsa:device=[hw:0,3]``
|
||||
``-af volnorm`` ``--af=drc`` (renamed)
|
||||
=========================== ========================================
|
||||
|
||||
.. note::
|
||||
|
||||
+1
-3
@@ -12,9 +12,7 @@ a movie player
|
||||
##############
|
||||
|
||||
:Author: wm4
|
||||
:Date: 2013-09-08
|
||||
:Copyright: GPLv3
|
||||
:Version: git
|
||||
:Manual section: 1
|
||||
:Manual group: multimedia
|
||||
|
||||
@@ -34,7 +32,7 @@ SYNOPSIS
|
||||
| **mpv** \dvb://[card\_number@]channel [options]
|
||||
| **mpv** \mf://[filemask|\@listfile] [-mf options] [options]
|
||||
| **mpv** cdda://track[-endtrack][:speed][/device] [options]
|
||||
| **mpv** [file|mms[t]|http|httpproxy|rt[s]p|ftp|udp|smb]:// [user:pass\@]URL[:port] [options]
|
||||
| **mpv** [file|mms[t]|http|httpproxy|rt[s]p|ftp|udp|smb]://[user:pass\@]URL[:port] [options]
|
||||
|
||||
|
||||
DESCRIPTION
|
||||
|
||||
@@ -47,22 +47,26 @@ If you are running Mac OSX and using homebrew we provide [homebrew-mpv][homebrew
|
||||
to date formula that compiles mpv with sensible dependencies and defaults for
|
||||
OSX.
|
||||
|
||||
configure --enable-* parameters
|
||||
-------------------------------
|
||||
### configure `--enable-*` parameters
|
||||
|
||||
The --enable-* parameters unconditionally force options on, completely
|
||||
The `--enable-*` parameters unconditionally force options on, completely
|
||||
skipping autodetection. This behavior is unlike what you may be used to from
|
||||
autoconf-based configure scripts that can decide to override you. This greater
|
||||
level of control comes at a price. You may have to provide the correct compiler
|
||||
and linker flags yourself.
|
||||
|
||||
If you used one of these options and experience a compilation or
|
||||
linking failure, make sure you have passed the necessary compiler/linker flags
|
||||
to configure.
|
||||
|
||||
mpv's configure script is greedy and automatically enables features as a result
|
||||
of autodetection. The cases where you may want to use `--enable-*` are very
|
||||
limited.
|
||||
|
||||
Bug reports
|
||||
-----------
|
||||
|
||||
Please use the [issue tracker][issue tracker] provided by GitHub to send us bug
|
||||
Please use the [issue tracker][issue-tracker] provided by GitHub to send us bug
|
||||
reports or feature requests.
|
||||
|
||||
Contributing
|
||||
@@ -75,9 +79,21 @@ make code review easier for both parties later on.
|
||||
Contacts
|
||||
--------
|
||||
|
||||
You can find us on IRC in `#mpv-player` on `irc.freenode.net`
|
||||
These forms of contact are meant to ask questions about mpv usage, give
|
||||
feedback on mpv and discuss it's development.
|
||||
|
||||
If possible, please avoid posting bugs here and use the [issue tracker][issue-tracker]
|
||||
instead.
|
||||
|
||||
- **Users IRC Channel**: `#mpv-player` on `irc.freenode.net`
|
||||
- **Users Mailing List**: `mpv-users@googlegroups.com` ([Archive / Subscribe][mpv-users]).
|
||||
- **Devel Mailing List**: `mpv-devel@googlegroups.com` ([Archive / Subscribe][mpv-devel])
|
||||
|
||||
To contact the `mpv` team in private write to `mpv-team@googlegroups.com`.
|
||||
|
||||
[changes]: https://github.com/mpv-player/mpv/blob/master/DOCS/man/en/changes.rst
|
||||
[mpv-build]: https://github.com/mpv-player/mpv-build
|
||||
[homebrew-mpv]: https://github.com/mpv-player/homebrew-mpv
|
||||
[issue tracker]: https://github.com/mpv-player/mpv/issues
|
||||
[issue-tracker]: https://github.com/mpv-player/mpv/issues
|
||||
[mpv-users]: https://groups.google.com/forum/?hl=en#!forum/mpv-users
|
||||
[mpv-devel]: https://groups.google.com/forum/?hl=en#!forum/mpv-devel
|
||||
@@ -86,6 +86,7 @@
|
||||
<string>VCD</string>
|
||||
<string>VFW</string>
|
||||
<string>VOB</string>
|
||||
<string>WEBM</string>
|
||||
<string>WMV</string>
|
||||
<string>asf</string>
|
||||
<string>avi</string>
|
||||
@@ -119,6 +120,7 @@
|
||||
<string>vcd</string>
|
||||
<string>vfw</string>
|
||||
<string>vob</string>
|
||||
<string>webm</string>
|
||||
<string>wmv</string>
|
||||
</array>
|
||||
<key>CFBundleTypeIconFile</key>
|
||||
|
||||
@@ -99,6 +99,11 @@ static int control(struct af_instance* af, int cmd, void* arg)
|
||||
for(i = 1; i < af->data->nch; i++)
|
||||
s->buf[i] = (uint8_t *)s->buf[0] + i*s->sz*af->data->bps;
|
||||
|
||||
if (!s->filename) {
|
||||
mp_msg(MSGT_AFILTER, MSGL_FATAL, "[export] No filename set.\n");
|
||||
return AF_ERROR;
|
||||
}
|
||||
|
||||
// Init memory mapping
|
||||
s->fd = open(s->filename, O_RDWR | O_CREAT | O_TRUNC, 0640);
|
||||
mp_msg(MSGT_AFILTER, MSGL_INFO, "[export] Exporting to file: %s\n", s->filename);
|
||||
|
||||
+20
-5
@@ -232,6 +232,7 @@ static int init(struct ao *ao)
|
||||
{
|
||||
struct pa_sample_spec ss;
|
||||
struct pa_channel_map map;
|
||||
pa_proplist *proplist = NULL;
|
||||
struct priv *priv = ao->priv;
|
||||
char *host = priv->cfg_host && priv->cfg_host[0] ? priv->cfg_host : NULL;
|
||||
char *sink = priv->cfg_sink && priv->cfg_sink[0] ? priv->cfg_sink : NULL;
|
||||
@@ -298,16 +299,26 @@ static int init(struct ao *ao)
|
||||
|
||||
if (!pa_sample_spec_valid(&ss)) {
|
||||
mp_msg(MSGT_AO, MSGL_ERR, "AO: [pulse] Invalid sample spec\n");
|
||||
goto fail;
|
||||
goto unlock_and_fail;
|
||||
}
|
||||
|
||||
if (!select_chmap(ao, &map))
|
||||
goto fail;
|
||||
|
||||
if (!(priv->stream = pa_stream_new(priv->context, "audio stream", &ss,
|
||||
&map)))
|
||||
goto unlock_and_fail;
|
||||
|
||||
if (!(proplist = pa_proplist_new())) {
|
||||
mp_msg(MSGT_AO, MSGL_ERR, "AO: [pulse] Failed to allocate proplist\n");
|
||||
goto unlock_and_fail;
|
||||
}
|
||||
(void)pa_proplist_sets(proplist, PA_PROP_MEDIA_ROLE, "video");
|
||||
|
||||
if (!(priv->stream = pa_stream_new_with_proplist(priv->context,
|
||||
"audio stream", &ss,
|
||||
&map, proplist)))
|
||||
goto unlock_and_fail;
|
||||
|
||||
pa_proplist_free(proplist);
|
||||
proplist = NULL;
|
||||
|
||||
pa_stream_set_state_callback(priv->stream, stream_state_cb, ao);
|
||||
pa_stream_set_write_callback(priv->stream, stream_request_cb, ao);
|
||||
pa_stream_set_latency_update_callback(priv->stream,
|
||||
@@ -344,6 +355,10 @@ fail:
|
||||
&& ao->probing))
|
||||
GENERIC_ERR_MSG(priv->context, "Init failed");
|
||||
}
|
||||
|
||||
if (proplist)
|
||||
pa_proplist_free(proplist);
|
||||
|
||||
uninit(ao, true);
|
||||
return -1;
|
||||
}
|
||||
|
||||
+19
-14
@@ -197,7 +197,8 @@ typedef struct mkv_demuxer {
|
||||
#define RAPROPERTIES5_SIZE 70
|
||||
|
||||
// Maximum number of subtitle packets that are accepted for pre-roll.
|
||||
#define NUM_SUB_PREROLL_PACKETS 100
|
||||
// (Subtitle packets added before first A/V keyframe packet is found with seek.)
|
||||
#define NUM_SUB_PREROLL_PACKETS 500
|
||||
|
||||
/**
|
||||
* \brief ensures there is space for at least one additional element
|
||||
@@ -2269,9 +2270,16 @@ static int handle_block(demuxer_t *demuxer, struct block_info *block_info)
|
||||
if (mkv_d->v_skip_to_keyframe)
|
||||
use_this_block = 0;
|
||||
} else if (track->type == MATROSKA_TRACK_SUBTITLE) {
|
||||
if (!use_this_block && mkv_d->subtitle_preroll) {
|
||||
mkv_d->subtitle_preroll--;
|
||||
if (!use_this_block && mkv_d->subtitle_preroll)
|
||||
use_this_block = 1;
|
||||
if (use_this_block) {
|
||||
if (mkv_d->subtitle_preroll) {
|
||||
mkv_d->subtitle_preroll--;
|
||||
} else {
|
||||
// This could overflow the demuxer queue.
|
||||
if (mkv_d->a_skip_to_keyframe || mkv_d->v_skip_to_keyframe)
|
||||
use_this_block = 0;
|
||||
}
|
||||
}
|
||||
if (use_this_block) {
|
||||
if (laces > 1) {
|
||||
@@ -2563,7 +2571,7 @@ static struct mkv_index *seek_with_cues(struct demuxer *demuxer, int seek_id,
|
||||
|
||||
if (index) { /* We've found an entry. */
|
||||
uint64_t seek_pos = index->filepos;
|
||||
if (mkv_d->subtitle_preroll) {
|
||||
if (flags & SEEK_SUBPREROLL) {
|
||||
uint64_t prev_target = 0;
|
||||
for (int i = 0; i < mkv_d->num_indexes; i++) {
|
||||
if (seek_id < 0 || mkv_d->indexes[i].tnum == seek_id) {
|
||||
@@ -2600,10 +2608,9 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
|
||||
a_tnum = track->tnum;
|
||||
}
|
||||
}
|
||||
mkv_d->subtitle_preroll = 0;
|
||||
if ((flags & SEEK_SUBPREROLL) && st_active[STREAM_SUB] &&
|
||||
st_active[STREAM_VIDEO])
|
||||
mkv_d->subtitle_preroll = NUM_SUB_PREROLL_PACKETS;
|
||||
mkv_d->subtitle_preroll = NUM_SUB_PREROLL_PACKETS;
|
||||
if (!st_active[STREAM_SUB] || !st_active[STREAM_VIDEO])
|
||||
flags &= ~SEEK_SUBPREROLL;
|
||||
if (!(flags & (SEEK_BACKWARD | SEEK_FORWARD))) {
|
||||
if (flags & SEEK_ABSOLUTE || rel_seek_secs < 0)
|
||||
flags |= SEEK_BACKWARD;
|
||||
@@ -2632,14 +2639,13 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
|
||||
if (!index)
|
||||
stream_seek(demuxer->stream, old_pos);
|
||||
|
||||
if (st_active[STREAM_VIDEO])
|
||||
mkv_d->v_skip_to_keyframe = 1;
|
||||
mkv_d->v_skip_to_keyframe = st_active[STREAM_VIDEO];
|
||||
mkv_d->a_skip_to_keyframe = st_active[STREAM_AUDIO];
|
||||
if (flags & SEEK_FORWARD)
|
||||
mkv_d->skip_to_timecode = target_timecode;
|
||||
else
|
||||
mkv_d->skip_to_timecode = index ? index->timecode * mkv_d->tc_scale
|
||||
: 0;
|
||||
mkv_d->a_skip_to_keyframe = 1;
|
||||
|
||||
demux_mkv_fill_buffer(demuxer);
|
||||
} else if ((demuxer->movi_end <= 0) || !(flags & SEEK_ABSOLUTE))
|
||||
@@ -2675,10 +2681,9 @@ static void demux_mkv_seek(demuxer_t *demuxer, float rel_seek_secs,
|
||||
mkv_d->cluster_end = 0;
|
||||
stream_seek(s, index->filepos);
|
||||
|
||||
if (st_active[STREAM_VIDEO])
|
||||
mkv_d->v_skip_to_keyframe = 1;
|
||||
mkv_d->v_skip_to_keyframe = st_active[STREAM_VIDEO];
|
||||
mkv_d->a_skip_to_keyframe = st_active[STREAM_AUDIO];
|
||||
mkv_d->skip_to_timecode = index->timecode * mkv_d->tc_scale;
|
||||
mkv_d->a_skip_to_keyframe = 1;
|
||||
|
||||
demux_mkv_fill_buffer(demuxer);
|
||||
}
|
||||
|
||||
+12
-11
@@ -628,9 +628,11 @@ static void mk_config_dir(char *subdir)
|
||||
{
|
||||
void *tmp = talloc_new(NULL);
|
||||
char *confdir = talloc_steal(tmp, mp_find_user_config_file(""));
|
||||
if (subdir)
|
||||
confdir = mp_path_join(tmp, bstr0(confdir), bstr0(subdir));
|
||||
mkdir(confdir, 0777);
|
||||
if (confdir) {
|
||||
if (subdir)
|
||||
confdir = mp_path_join(tmp, bstr0(confdir), bstr0(subdir));
|
||||
mkdir(confdir, 0777);
|
||||
}
|
||||
talloc_free(tmp);
|
||||
}
|
||||
|
||||
@@ -867,6 +869,8 @@ void mp_write_watch_later_conf(struct MPContext *mpctx)
|
||||
if (!conffile)
|
||||
goto exit;
|
||||
|
||||
mp_msg(MSGT_CPLAYER, MSGL_INFO, "Saving state.\n");
|
||||
|
||||
FILE *file = fopen(conffile, "wb");
|
||||
if (!file)
|
||||
goto exit;
|
||||
@@ -1789,7 +1793,7 @@ static void reset_subtitles(struct MPContext *mpctx)
|
||||
osd_changed(mpctx->osd, OSDTYPE_SUB);
|
||||
}
|
||||
|
||||
static void update_subtitles(struct MPContext *mpctx, double refpts_tl)
|
||||
static void update_subtitles(struct MPContext *mpctx)
|
||||
{
|
||||
struct MPOpts *opts = mpctx->opts;
|
||||
if (!(mpctx->initialized_flags & INITIALIZED_SUB))
|
||||
@@ -1808,7 +1812,7 @@ static void update_subtitles(struct MPContext *mpctx, double refpts_tl)
|
||||
|
||||
mpctx->osd->video_offset = track->under_timeline ? mpctx->video_offset : 0;
|
||||
|
||||
double refpts_s = refpts_tl - mpctx->osd->video_offset;
|
||||
double refpts_s = mpctx->playback_pts - mpctx->osd->video_offset;
|
||||
double curpts_s = refpts_s + opts->sub_delay;
|
||||
|
||||
if (!track->preloaded) {
|
||||
@@ -2790,8 +2794,6 @@ static bool redraw_osd(struct MPContext *mpctx)
|
||||
if (vo_redraw_frame(vo) < 0)
|
||||
return false;
|
||||
|
||||
if (mpctx->sh_video)
|
||||
update_subtitles(mpctx, mpctx->sh_video->pts);
|
||||
draw_osd(mpctx);
|
||||
|
||||
vo_flip_page(vo, 0, -1);
|
||||
@@ -3511,7 +3513,7 @@ static void run_playloop(struct MPContext *mpctx)
|
||||
mpctx->video_pts = sh_video->pts;
|
||||
mpctx->last_vo_pts = mpctx->video_pts;
|
||||
mpctx->playback_pts = mpctx->video_pts;
|
||||
update_subtitles(mpctx, sh_video->pts);
|
||||
update_subtitles(mpctx);
|
||||
update_osd_msg(mpctx);
|
||||
draw_osd(mpctx);
|
||||
|
||||
@@ -3598,11 +3600,10 @@ static void run_playloop(struct MPContext *mpctx)
|
||||
}
|
||||
mpctx->playback_pts = a_pos;
|
||||
print_status(mpctx);
|
||||
|
||||
if (!mpctx->sh_video)
|
||||
update_subtitles(mpctx, a_pos);
|
||||
}
|
||||
|
||||
update_subtitles(mpctx);
|
||||
|
||||
/* It's possible for the user to simultaneously switch both audio
|
||||
* and video streams to "disabled" at runtime. Handle this by waiting
|
||||
* rather than immediately stopping playback due to EOF.
|
||||
|
||||
+2
-2
@@ -78,12 +78,12 @@ char *mp_find_config_file(const char *filename)
|
||||
char *mp_find_user_config_file(const char *filename)
|
||||
{
|
||||
char *homedir = NULL, *buff = NULL;
|
||||
static char *homepath = NULL;
|
||||
char *homepath = NULL;
|
||||
#ifdef __MINGW32__
|
||||
char *config_dir = "mpv";
|
||||
char buf[MAX_PATH];
|
||||
|
||||
if (homepath == NULL) {
|
||||
char buf[MAX_PATH];
|
||||
if (SHGetFolderPathA(NULL, CSIDL_LOCAL_APPDATA|CSIDL_FLAG_CREATE, NULL,
|
||||
SHGFP_TYPE_CURRENT, buf) == S_OK) {
|
||||
|
||||
|
||||
+2
-2
@@ -496,7 +496,7 @@ static int get_chapter_time(ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int titl
|
||||
last_cell = pgc->program_map[ptt[i].pgn];
|
||||
else
|
||||
last_cell = 0;
|
||||
do {
|
||||
while (cell < last_cell) {
|
||||
if(!(pgc->cell_playback[cell-1].block_type == BLOCK_TYPE_ANGLE_BLOCK &&
|
||||
pgc->cell_playback[cell-1].block_mode != BLOCK_MODE_FIRST_CELL)
|
||||
) {
|
||||
@@ -508,7 +508,7 @@ static int get_chapter_time(ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int titl
|
||||
cur++;
|
||||
}
|
||||
cell++;
|
||||
} while(cell < last_cell);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
+1
-1
@@ -250,7 +250,7 @@ static struct vf_instance *vf_open(struct MPOpts *opts, vf_instance_t *next,
|
||||
goto error;
|
||||
vf->priv = priv;
|
||||
int retcode = vf->info->vf_open(vf, (char *)args);
|
||||
if (retcode < 0)
|
||||
if (retcode < 1)
|
||||
goto error;
|
||||
return vf;
|
||||
|
||||
|
||||
@@ -569,8 +569,11 @@ static bool create_display (struct vo_wayland_state *wl)
|
||||
{
|
||||
wl->display.display = wl_display_connect(NULL);
|
||||
|
||||
if (!wl->display.display)
|
||||
if (!wl->display.display) {
|
||||
MP_ERR(wl->vo, "failed to connect to a wayland server: "
|
||||
"check if a wayland compositor is running\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
wl_list_init(&wl->display.output_list);
|
||||
wl->display.registry = wl_display_get_registry(wl->display.display);
|
||||
@@ -644,7 +647,7 @@ static bool create_input (struct vo_wayland_state *wl)
|
||||
wl->input.xkb.context = xkb_context_new(0);
|
||||
|
||||
if (!wl->input.xkb.context) {
|
||||
MP_ERR(wl, "failed to initialize input\n");
|
||||
MP_ERR(wl->vo, "failed to initialize input: check xkbcommon\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -680,7 +683,6 @@ int vo_wayland_init (struct vo *vo)
|
||||
|| !create_window(wl)
|
||||
|| !create_cursor(wl))
|
||||
{
|
||||
MP_ERR(wl, "failed to initialize backend\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -766,8 +768,12 @@ static int vo_wayland_check_events (struct vo *vo)
|
||||
* when pausing no input events get queued so we have to check if there
|
||||
* are events to read from the file descriptor through poll */
|
||||
if (poll(&fd, 1, 0) > 0) {
|
||||
if (fd.revents & POLLERR || fd.revents & POLLHUP)
|
||||
MP_ERR(wl, "error occurred on the display fd\n");
|
||||
if (fd.revents & POLLERR || fd.revents & POLLHUP) {
|
||||
MP_FATAL(wl, "error occurred on the display fd: "
|
||||
"closing file descriptor\n");
|
||||
close(wl->display.display_fd);
|
||||
mp_input_put_key(vo->input_ctx, MP_KEY_CLOSE_WIN);
|
||||
}
|
||||
if (fd.revents & POLLIN)
|
||||
wl_display_dispatch(dp);
|
||||
if (fd.revents & POLLOUT)
|
||||
|
||||
+11
-5
@@ -455,6 +455,7 @@ int vo_x11_init(struct vo *vo)
|
||||
if (!x11->display) {
|
||||
mp_msg(MSGT_VO, MSGL_ERR,
|
||||
"vo: couldn't open the X11 display (%s)!\n", dispName);
|
||||
|
||||
talloc_free(x11);
|
||||
vo->x11 = NULL;
|
||||
return 0;
|
||||
@@ -469,6 +470,9 @@ int vo_x11_init(struct vo *vo)
|
||||
}
|
||||
|
||||
x11->xim = XOpenIM(x11->display, NULL, NULL, NULL);
|
||||
if (!x11->xim)
|
||||
mp_msg(MSGT_VO, MSGL_WARN,
|
||||
"x11: XOpenIM() failed. Unicode input will not work.\n");
|
||||
|
||||
init_atoms(vo->x11);
|
||||
|
||||
@@ -982,11 +986,13 @@ static void vo_x11_create_window(struct vo *vo, XVisualInfo *vis, int x, int y,
|
||||
x11->mouse_cursor_hidden = false;
|
||||
vo_set_cursor_hidden(vo, true);
|
||||
}
|
||||
x11->xic = XCreateIC(x11->xim,
|
||||
XNInputStyle, XIMPreeditNone | XIMStatusNone,
|
||||
XNClientWindow, x11->window,
|
||||
XNFocusWindow, x11->window,
|
||||
NULL);
|
||||
if (x11->xim) {
|
||||
x11->xic = XCreateIC(x11->xim,
|
||||
XNInputStyle, XIMPreeditNone | XIMStatusNone,
|
||||
XNClientWindow, x11->window,
|
||||
XNFocusWindow, x11->window,
|
||||
NULL);
|
||||
}
|
||||
|
||||
vo_x11_update_window_title(vo);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user