From e11c910c396c9e7c7988b8222f574dad6fd277d0 Mon Sep 17 00:00:00 2001 From: alphanu1 <37101891+alphanu1@users.noreply.github.com> Date: Tue, 12 Feb 2019 15:58:41 +0000 Subject: [PATCH] Fix native naming after new additions CRT dynamic width changes Change menu detection width Using alternative variables for CRT width and height see output Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Add files via upload Update video_crt_switch.c Update video_crt_switch.c Update video_display_server.h Update video_display_server.c Update dispserv_win32.c Update dispserv_x11.c Update menu_cbs_ok.c X centring on the fly X centring on the fly Update dispserv_x11.c X centring on the fly Update dispserv_win32.c Fix dispserv_win32.c Fix dispserv_win32.c --- gfx/display_servers/dispserv_win32.c | 4 ++-- gfx/display_servers/dispserv_x11.c | 17 +++++++++------ gfx/video_crt_switch.c | 32 ++++++++++++++++++---------- gfx/video_display_server.c | 4 ++-- gfx/video_display_server.h | 4 ++-- gfx/video_driver.c | 3 ++- menu/cbs/menu_cbs_ok.c | 2 +- menu/menu_setting.c | 3 ++- 8 files changed, 43 insertions(+), 26 deletions(-) diff --git a/gfx/display_servers/dispserv_win32.c b/gfx/display_servers/dispserv_win32.c index f06aea3487..ff8ab2d5c4 100644 --- a/gfx/display_servers/dispserv_win32.c +++ b/gfx/display_servers/dispserv_win32.c @@ -116,7 +116,7 @@ static void win32_display_server_destroy(void *data) if (win32_orig_width > 0 && win32_orig_height > 0) video_display_server_set_resolution(win32_orig_width, win32_orig_height, - win32_orig_refresh, (float)win32_orig_refresh, crt_center, 0); + win32_orig_refresh, (float)win32_orig_refresh, crt_center, 0, 0); #ifdef HAS_TASKBAR_EXT if (g_taskbarList) @@ -210,7 +210,7 @@ static bool win32_display_server_set_window_decorations(void *data, bool on) } static bool win32_display_server_set_resolution(void *data, - unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index) + unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index, int xoffset) { DEVMODE curDevmode; int iModeNum; diff --git a/gfx/display_servers/dispserv_x11.c b/gfx/display_servers/dispserv_x11.c index 715cb9752d..e67361535a 100644 --- a/gfx/display_servers/dispserv_x11.c +++ b/gfx/display_servers/dispserv_x11.c @@ -44,7 +44,9 @@ static char new_mode[250] = {0}; static char xrandr[250] = {0}; static char fbset[150] = {0}; static char output[500] = {0}; -static char output4[500] = {0}; +static char output4[500] = {0}; +static char crt_name[10] = {0}; +static int crt_name_id = 0; static bool crt_en = false; static unsigned crtid = 20; static XRRModeInfo crt_rrmode; @@ -127,7 +129,7 @@ static bool x11_display_server_set_window_decorations(void *data, bool on) } static bool x11_display_server_set_resolution(void *data, - unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index) + unsigned width, unsigned height, int int_hz, float hz, int center, int monitor_index, int xoffset) { int screen; Window window; @@ -150,6 +152,9 @@ static bool x11_display_server_set_resolution(void *data, float pixel_clock = 0; crt_en = true; + crt_name_id += 1; + snprintf(crt_name, sizeof(crt_name), "CRT%d", crt_name_id); + snprintf(old_mode, sizeof(old_mode), "%s", new_mode); @@ -161,7 +166,7 @@ static bool x11_display_server_set_resolution(void *data, video_monitor_set_refresh_rate(hz); /* following code is the mode line generator */ - hsp = (width * 1.140) + x_offset; + hsp = (width * 1.140) - (xoffset*4); hfp = width * 1.055; pwidth = width; @@ -228,20 +233,20 @@ static bool x11_display_server_set_resolution(void *data, /* create interlaced newmode from modline variables */ if (height < 300) { - snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"CRT_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d -hsync -vsync", width, height, hz, pixel_clock, + snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"%s_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d -hsync -vsync",crt_name, width, height, hz, pixel_clock, width, hfp, hsp, hbp, height, vfp, vsp, vbp); system(xrandr); } /* create interlaced newmode from modline variables */ if (height > 300) { - snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"CRT_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d interlace -hsync -vsync", width, height, hz, pixel_clock, + snprintf(xrandr, sizeof(xrandr), "xrandr --newmode \"%s_%dx%d_%0.2f\" %f %d %d %d %d %d %d %d %d interlace -hsync -vsync",crt_name, width, height, hz, pixel_clock, width, hfp, hsp, hbp, height, vfp, vsp, vbp); system(xrandr); } /* variable for new mode */ - snprintf(new_mode, sizeof(new_mode), "CRT_%dx%d_%0.2f", width, height, hz); + snprintf(new_mode, sizeof(new_mode), "%s_%dx%d_%0.2f",crt_name, width, height, hz); /* need to run loops for DVI0 - DVI-2 and VGA0 - VGA-2 outputs to * add and delete modes */ diff --git a/gfx/video_crt_switch.c b/gfx/video_crt_switch.c index 494315653c..b6e83698fc 100644 --- a/gfx/video_crt_switch.c +++ b/gfx/video_crt_switch.c @@ -41,6 +41,7 @@ static unsigned ra_set_core_hz = 0; static unsigned orig_width = 0; static unsigned orig_height = 0; static int crt_center_adjust = 0; +static int crt_tmp_center_adjust = 0; static bool first_run = true; @@ -97,7 +98,7 @@ void crt_aspect_ratio_switch(unsigned width, unsigned height) static void switch_res_crt(unsigned width, unsigned height) { video_display_server_set_resolution(width, height, - ra_set_core_hz, ra_core_hz, crt_center_adjust, crt_index); + ra_set_core_hz, ra_core_hz, crt_center_adjust, crt_index, crt_center_adjust); #if defined(HAVE_VIDEOCORE) crt_rpi_switch(width, height, ra_core_hz); video_monitor_set_refresh_rate(ra_core_hz); @@ -119,7 +120,7 @@ static void crt_screen_setup_aspect(unsigned width, unsigned height) if (height == 4) { /* detect menu only */ - if (width < 1920) + if (width < 700) width = 320; height = 240; @@ -181,13 +182,19 @@ void crt_switch_res_core(unsigned width, unsigned height, { /* ra_core_hz float passed from within * void video_driver_monitor_adjust_system_rates(void) */ + if (width == 4 ) + { + width = 320; + height = 240; + } - ra_core_width = width; ra_core_height = height; ra_core_hz = hz; if (dynamic == true) ra_core_width = crt_compute_dynamic_width(width); + else + ra_core_width = width; crt_center_adjust = crt_switch_center_adjust; crt_index = monitor_index; @@ -206,12 +213,13 @@ void crt_switch_res_core(unsigned width, unsigned height, /* Detect resolution change and switch */ if ( (ra_tmp_height != ra_core_height) || - (ra_core_width != ra_tmp_width) + (ra_core_width != ra_tmp_width) || (crt_center_adjust != crt_tmp_center_adjust) ) - crt_screen_setup_aspect(width, height); + crt_screen_setup_aspect(ra_core_width, ra_core_height); ra_tmp_height = ra_core_height; ra_tmp_width = ra_core_width; + crt_tmp_center_adjust = crt_center_adjust; /* Check if aspect is correct, if not change */ if (video_driver_get_aspect_ratio() != fly_aspect) @@ -231,20 +239,22 @@ void crt_video_restore(void) int crt_compute_dynamic_width(int width) { - double p_clock = 18000000; + double p_clock = 15000000; int min_height = 261; int dynamic_width = 0; #if defined(HAVE_VIDEOCORE) double p_clock = 32000000; #endif - for (int i =1; i < 10; i++) + for (int i =0; i < 10; i++) { - dynamic_width = (width*0.5)*i; + dynamic_width = (width*1.5)*i; if ((dynamic_width * min_height * ra_core_hz) > p_clock) - return dynamic_width; + break; + + } - return width; + return dynamic_width; } #if defined(HAVE_VIDEOCORE) @@ -296,7 +306,7 @@ static void crt_rpi_switch(int width, int height, float hz) roundw = 1.34; hfp = width * 0.065; - hsp = width * 0.1433-hfp; + hsp = width * 0.1433-hfp+(crt_center_adjust*4); hbp = width * 0.3-hsp-hfp; diff --git a/gfx/video_display_server.c b/gfx/video_display_server.c index 31d1b3a5b0..065e5e16c6 100644 --- a/gfx/video_display_server.c +++ b/gfx/video_display_server.c @@ -90,10 +90,10 @@ bool video_display_server_set_window_decorations(bool on) } bool video_display_server_set_resolution(unsigned width, unsigned height, - int int_hz, float hz, int center, int monitor_index) + int int_hz, float hz, int center, int monitor_index, int xoffset) { if (current_display_server && current_display_server->set_resolution) - return current_display_server->set_resolution(current_display_server_data, width, height, int_hz, hz, center, monitor_index); + return current_display_server->set_resolution(current_display_server_data, width, height, int_hz, hz, center, monitor_index, xoffset); return false; } diff --git a/gfx/video_display_server.h b/gfx/video_display_server.h index 8cb3be269f..55de52ba6d 100644 --- a/gfx/video_display_server.h +++ b/gfx/video_display_server.h @@ -41,7 +41,7 @@ typedef struct video_display_server bool (*set_window_progress)(void *data, int progress, bool finished); bool (*set_window_decorations)(void *data, bool on); bool (*set_resolution)(void *data, unsigned width, - unsigned height, int int_hz, float hz, int center, int monitor_index); + unsigned height, int int_hz, float hz, int center, int monitor_index, int xoffset); void *(*get_resolution_list)(void *data, unsigned *size); const char *(*get_output_options)(void *data); @@ -60,7 +60,7 @@ bool video_display_server_set_window_decorations(bool on); bool video_display_server_set_resolution( unsigned width, unsigned height, - int int_hz, float hz, int center, int monitor_index); + int int_hz, float hz, int center, int monitor_index, int xoffset); void *video_display_server_get_resolution_list(unsigned *size); diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 28ee36f792..9ad45bd950 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -2648,11 +2648,12 @@ void video_driver_frame(const void *data, unsigned width, width = 3840; if (video_info.crt_switch_resolution_super == 1920) width = 1920; + if (video_info.crt_switch_resolution_super == 1) video_driver_crt_dynamic_super_width = true; else video_driver_crt_dynamic_super_width = false; - + crt_switch_res_core(width, height, video_driver_core_hz, video_info.crt_switch_resolution, video_info.crt_switch_center_adjust, video_info.monitor_index, video_driver_crt_dynamic_super_width); } else if (!video_info.crt_switch_resolution) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 466f949b30..3b58c68cbe 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -4725,7 +4725,7 @@ static int action_ok_push_dropdown_item_resolution(const char *path, refreshrate = strtoul(pch, NULL, 0); if (video_display_server_set_resolution(width, height, - refreshrate, (float)refreshrate, 0, 0)) + refreshrate, (float)refreshrate, 0, 0, 0)) { settings_t *settings = config_get_ptr(); diff --git a/menu/menu_setting.c b/menu/menu_setting.c index d2bd18bc49..d95b3bdf88 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -1195,10 +1195,11 @@ static void setting_get_string_representation_crt_switch_resolution_super( return; if (*setting->value.target.unsigned_integer == 0) - strlcpy(s, msg_hash_to_str(MSG_NATIVE), len); + strlcpy(s, "NATIVE", len); else snprintf(s, len, "%d", *setting->value.target.unsigned_integer); /* TO DO make 1 read as DYNAMIC */ + if (*setting->value.target.unsigned_integer == 1) strlcpy(s, "DYNAMIC", len); else