mirror of https://github.com/mpv-player/mpv
video/w32_common: switch full screening to options cache
* Instead of following VOCTRL_FULLSCREEN, check for option changes. * Instead of signaling VO_EVENT_FULLSCREEN_STATE, update the cached option structure and have it propagated to the origin. Additionally, gets rid of all the straight usage of the VO options structure. Done in a similar style to the Wayland common file, where in case of reading the value, the "payload" from cache is utilized.
This commit is contained in:
parent
0bf0efd6d3
commit
8200304768
|
@ -26,6 +26,7 @@
|
|||
#include <shobjidl.h>
|
||||
#include <avrt.h>
|
||||
|
||||
#include "options/m_config.h"
|
||||
#include "options/options.h"
|
||||
#include "input/keycodes.h"
|
||||
#include "input/input.h"
|
||||
|
@ -74,6 +75,7 @@ struct vo_w32_state {
|
|||
struct mp_log *log;
|
||||
struct vo *vo;
|
||||
struct mp_vo_opts *opts;
|
||||
struct m_config_cache *opts_cache;
|
||||
struct input_ctx *input_ctx;
|
||||
|
||||
pthread_t thread;
|
||||
|
@ -839,7 +841,9 @@ static bool update_fullscreen_state(struct vo_w32_state *w32)
|
|||
}
|
||||
|
||||
bool toggle_fs = w32->current_fs != new_fs;
|
||||
w32->current_fs = new_fs;
|
||||
w32->opts->fullscreen = w32->current_fs = new_fs;
|
||||
m_config_cache_write_opt(w32->opts_cache,
|
||||
&w32->opts->fullscreen);
|
||||
|
||||
if (toggle_fs) {
|
||||
if (w32->current_fs) {
|
||||
|
@ -1047,7 +1051,7 @@ static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam,
|
|||
if (IsMaximized(w32->window) && w32->current_fs) {
|
||||
w32->toggle_fs = true;
|
||||
reinit_window_state(w32);
|
||||
signal_events(w32, VO_EVENT_FULLSCREEN_STATE);
|
||||
|
||||
return 0;
|
||||
}
|
||||
break;
|
||||
|
@ -1482,10 +1486,11 @@ int vo_w32_init(struct vo *vo)
|
|||
*w32 = (struct vo_w32_state){
|
||||
.log = mp_log_new(w32, vo->log, "win32"),
|
||||
.vo = vo,
|
||||
.opts = vo->opts,
|
||||
.opts_cache = m_config_cache_alloc(w32, vo->global, &vo_sub_opts),
|
||||
.input_ctx = vo->input_ctx,
|
||||
.dispatch = mp_dispatch_create(w32),
|
||||
};
|
||||
w32->opts = w32->opts_cache->opts;
|
||||
vo->w32 = w32;
|
||||
|
||||
if (pthread_create(&w32->thread, NULL, gui_thread, w32))
|
||||
|
@ -1560,10 +1565,21 @@ static char **get_disp_names(struct vo_w32_state *w32)
|
|||
static int gui_thread_control(struct vo_w32_state *w32, int request, void *arg)
|
||||
{
|
||||
switch (request) {
|
||||
case VOCTRL_FULLSCREEN:
|
||||
if (w32->opts->fullscreen != w32->current_fs)
|
||||
reinit_window_state(w32);
|
||||
case VOCTRL_VO_OPTS_CHANGED: {
|
||||
void *changed_option;
|
||||
|
||||
while (m_config_cache_get_next_changed(w32->opts_cache,
|
||||
&changed_option))
|
||||
{
|
||||
struct mp_vo_opts *vo_opts = w32->opts_cache->opts;
|
||||
|
||||
if (changed_option == &vo_opts->fullscreen) {
|
||||
reinit_window_state(w32);
|
||||
}
|
||||
}
|
||||
|
||||
return VO_TRUE;
|
||||
}
|
||||
case VOCTRL_ONTOP:
|
||||
update_window_state(w32);
|
||||
return VO_TRUE;
|
||||
|
@ -1571,9 +1587,6 @@ static int gui_thread_control(struct vo_w32_state *w32, int request, void *arg)
|
|||
update_window_style(w32);
|
||||
update_window_state(w32);
|
||||
return VO_TRUE;
|
||||
case VOCTRL_GET_FULLSCREEN:
|
||||
*(bool *)arg = w32->current_fs;
|
||||
return VO_TRUE;
|
||||
case VOCTRL_GET_UNFS_WINDOW_SIZE: {
|
||||
int *s = arg;
|
||||
|
||||
|
|
Loading…
Reference in New Issue