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