OSDN Git Service

[Fix] TermCenteredOffsetSetter で設定した状態を term_get_size に反映させる
authorHabu <habu1010+github@gmail.com>
Sun, 22 Jan 2023 05:09:08 +0000 (14:09 +0900)
committerHabu <habu1010+github@gmail.com>
Sun, 22 Jan 2023 05:16:34 +0000 (14:16 +0900)
TermCenteredOffsetSetter で 80x24 のサイズなどで中央に表示しているときに
term_get_size で本当のウィンドウサイズが取得されると、ウィンドウサイズを考慮した描画
処理との整合性が取れなくなるので、 term_get_size でも TermCenteredOffsetSetter
で設定しているサイズが取得されるようにする。

src/floor/object-scanner.cpp
src/io-dump/character-dump.cpp
src/term/z-term.cpp
src/term/z-term.h
src/view/display-inventory.cpp
src/window/main-window-equipments.cpp

index 65ee611..3c55e3b 100644 (file)
@@ -102,8 +102,6 @@ static void prepare_label_string_floor(FloorType *floor_ptr, char *label, FLOOR_
  */
 COMMAND_CODE show_floor_items(PlayerType *player_ptr, int target_item, POSITION y, POSITION x, TERM_LEN *min_width, const ItemTester &item_tester)
 {
-    TermOffsetSetter tos(0, std::nullopt);
-
     COMMAND_CODE i, m;
     int j, k, l;
     ItemEntity *o_ptr;
index e8436a0..336b84f 100644 (file)
@@ -589,7 +589,7 @@ static std::string get_check_sum(void)
  */
 void make_character_dump(PlayerType *player_ptr, FILE *fff)
 {
-    TermOffsetSetter tos(0, 0);
+    TermCenteredOffsetSetter tos(std::nullopt, std::nullopt);
 
     fprintf(fff, _("  [%s キャラクタ情報]\n\n", "  [%s Character Dump]\n\n"), get_version().data());
 
index cb635ef..7a0639c 100644 (file)
@@ -84,13 +84,26 @@ TermOffsetSetter::~TermOffsetSetter()
  * @param height 表示に使用する領域の縦幅
  */
 TermCenteredOffsetSetter::TermCenteredOffsetSetter(std::optional<TERM_LEN> width, std::optional<TERM_LEN> height)
+    : term(game_term)
+    , orig_centered_wid(game_term != nullptr ? game_term->centered_wid : std::nullopt)
+    , orig_centered_hgt(game_term != nullptr ? game_term->centered_hgt : std::nullopt)
 {
-    TERM_LEN term_width, term_height;
-    term_get_size(&term_width, &term_height);
-
-    const auto offset_x = width.has_value() ? (term_width - width.value()) / 2 : 0;
-    const auto offset_y = height.has_value() ? (term_height - height.value()) / 2 : 0;
+    const auto offset_x = width.has_value() ? (game_term->wid - width.value()) / 2 : 0;
+    const auto offset_y = height.has_value() ? (game_term->hgt - height.value()) / 2 : 0;
     this->tos.emplace(offset_x, offset_y);
+
+    game_term->centered_wid = (width < game_term->wid) ? width : std::nullopt;
+    game_term->centered_hgt = (height < game_term->hgt) ? height : std::nullopt;
+}
+
+TermCenteredOffsetSetter::~TermCenteredOffsetSetter()
+{
+    if (this->term == nullptr) {
+        return;
+    }
+
+    this->term->centered_wid = this->orig_centered_wid;
+    this->term->centered_hgt = this->orig_centered_hgt;
 }
 
 /*
@@ -1841,9 +1854,8 @@ errr term_get_cursor(int *v)
  */
 errr term_get_size(TERM_LEN *w, TERM_LEN *h)
 {
-    /* Access the cursor */
-    (*w) = game_term->wid;
-    (*h) = game_term->hgt;
+    (*w) = game_term->centered_wid.value_or(game_term->wid);
+    (*h) = game_term->centered_hgt.value_or(game_term->hgt);
     return 0;
 }
 
index bc6a5be..2350393 100644 (file)
@@ -77,6 +77,9 @@ struct term_type {
     TERM_LEN wid{}; //!< Window Width(max 255)
     TERM_LEN hgt{}; //!< Window Height(max 255)
 
+    std::optional<TERM_LEN> centered_wid{};
+    std::optional<TERM_LEN> centered_hgt{};
+
     TERM_LEN offset_x{};
     TERM_LEN offset_y{};
 
@@ -134,7 +137,7 @@ private:
 class TermCenteredOffsetSetter {
 public:
     TermCenteredOffsetSetter(std::optional<TERM_LEN> width, std::optional<TERM_LEN> height);
-    ~TermCenteredOffsetSetter() = default;
+    ~TermCenteredOffsetSetter();
     TermCenteredOffsetSetter(const TermCenteredOffsetSetter &) = delete;
     TermCenteredOffsetSetter &operator=(const TermCenteredOffsetSetter &) = delete;
     TermCenteredOffsetSetter(TermCenteredOffsetSetter &&) = delete;
@@ -142,6 +145,9 @@ public:
 
 private:
     std::optional<TermOffsetSetter> tos;
+    term_type *term;
+    std::optional<TERM_LEN> orig_centered_wid;
+    std::optional<TERM_LEN> orig_centered_hgt;
 };
 
 /**** Available Constants ****/
index ba6daaa..e5f26be 100644 (file)
@@ -28,8 +28,6 @@
  */
 COMMAND_CODE show_inventory(PlayerType *player_ptr, int target_item, BIT_FLAGS mode, const ItemTester &item_tester)
 {
-    TermOffsetSetter tos(0, std::nullopt);
-
     COMMAND_CODE i;
     int k, l, z = 0;
     ItemEntity *o_ptr;
index 113948e..21d7853 100644 (file)
@@ -31,8 +31,6 @@
  */
 COMMAND_CODE show_equipment(PlayerType *player_ptr, int target_item, BIT_FLAGS mode, const ItemTester &item_tester)
 {
-    TermOffsetSetter tos(0, std::nullopt);
-
     COMMAND_CODE i;
     int j, k, l;
     ItemEntity *o_ptr;