feat: allow setting tiles window width by ratio
authoradvil <rawlins@gmail.com>
Sun, 2 May 2021 15:41:47 +0000 (11:41 -0400)
committeradvil <rawlins@gmail.com>
Sun, 2 May 2021 15:41:47 +0000 (11:41 -0400)
On the previous defaults, the tiles window width was screen edge - 90 in
both dimensions. This works fine on many screen ratios, but is kind of
annoying (in my opinion) on an ultrawide screen. This commit provides an
option to override the width setting using a ratio of the height, and
makes it activated by default. When activated, the width setting is
instead used as a maximum value. This has no impact on full screen mode.
This can be disabled by just setting `tile_window_ratio` to 0 or a
negative value, in which case the behavior is the same as before
(including if you had custom values set here).

I've used the golden ratio as the default value, so on a 4:3 screen
you'd typically have the same default results as before, but on a wider
screen the window default width will be capped. This looks (again, IMO)
a lot better on an ultrawide ratio like 2:1 or greater.

It would be ideal, eventually, to actually remember positioning and
size.

crawl-ref/docs/options_guide.txt
crawl-ref/source/initfile.cc
crawl-ref/source/options.h
crawl-ref/source/windowmanager-sdl.cc

index bf213c5..6fa2631 100644 (file)
@@ -2016,11 +2016,25 @@ tile_tag_pref = (none| named | enemy | tutorial )
                        and of named enemy monsters
         Examples for named monsters are uniques and ghosts.
 
-tile_window_width  = -90
 tile_window_height = -90
-        The width and height of the window, in pixels. If set to zero, it
-        will auto-size the window. If set to a negative number (default), it
-        will use the screen's resolution, minus the given value.
+tile_window_width  = -90
+        Options for setting the width and height of the window, in pixels. When
+        positive, these set the window size directly. When set to 0, the window
+        is auto-sized. When set to a negative number, these values will be
+        interpreted as the screen's resolution minus the given value. The width
+        may be overridden by `tile_window_ratio`, below, in which case
+        `tile_window_width` is used as a maximum width. On some window
+        managers, the position of OS user interface elements may enforce
+        smaller values for these. For example, on MacOS the window will not
+        overlap with the dock or menu bar.
+
+tile_window_ratio  = 1618
+        When set to a positive value, tiles will use this value to determine
+        the window width as a ratio of the window height, scaled by 1000. In
+        particular: w = h * tile_window_ratio / 1000.
+        If this value is set, `tile_window_width` is used as a maximum width.
+        The minimum width is determined by UI layout. This value is ignored in
+        full screen mode. Set to a value <= 0 to disable.
 
 game_scale = 1
         An integer scale value between 1 and 8 that will increase the size of
index d302ad4..bbb4c6a 100644 (file)
@@ -388,6 +388,7 @@ const vector<GameOption*> game_options::build_options_list()
         new IntGameOption(SIMPLE_NAME(tile_key_repeat_delay), 200, 0, INT_MAX),
         new IntGameOption(SIMPLE_NAME(tile_window_width), -90, INT_MIN, INT_MAX),
         new IntGameOption(SIMPLE_NAME(tile_window_height), -90, INT_MIN, INT_MAX),
+        new IntGameOption(SIMPLE_NAME(tile_window_ratio), 1618, INT_MIN, INT_MAX),
         new StringGameOption(SIMPLE_NAME(tile_font_crt_file), MONOSPACED_FONT),
         new StringGameOption(SIMPLE_NAME(tile_font_msg_file), MONOSPACED_FONT),
         new StringGameOption(SIMPLE_NAME(tile_font_stat_file), MONOSPACED_FONT),
index 36d2f9a..dea7d0b 100644 (file)
@@ -563,6 +563,7 @@ public:
     screen_mode tile_full_screen;
     int         tile_window_width;
     int         tile_window_height;
+    int         tile_window_ratio;
     maybe_bool  tile_use_small_layout;
 #endif
     int         tile_cell_pixels;
index e29ccff..7c04e08 100644 (file)
@@ -440,10 +440,12 @@ int SDLWrapper::init(coord_def *m_windowsz)
     }
     else
     {
-        int x = Options.tile_window_width;
         int y = Options.tile_window_height;
+        int x = Options.tile_window_width;
         x = (x > 0) ? x : _desktop_width + x;
         y = (y > 0) ? y : _desktop_height + y;
+        if (Options.tile_window_ratio > 0)
+            x = min(x, y * Options.tile_window_ratio / 1000);
 #ifdef TOUCH_UI
         // allow *much* smaller windows than default, primarily for testing
         // touch_ui features in an x86 build