#pragma mark Prototypes
+static BOOL redraw_for_tiles_or_term0_font(void);
static void wakeup_event_loop(void);
static void hook_plog(const char *str);
static void hook_quit(const char * str);
}
/**
+ * Handle redrawing for a change to the tile set, tile scaling, or main window
+ * font. Returns YES if the redrawing was initiated. Otherwise returns NO.
+ */
+static BOOL redraw_for_tiles_or_term0_font(void)
+{
+ /*
+ * In Angband 4.2, do_cmd_redraw() will always clear, but only provides
+ * something to replace the erased content if a character has been
+ * generated. In Hengband, do_cmd_redraw() isn't safe to call unless a
+ * character has been generated. Therefore, only call it if a character
+ * has been generated.
+ */
+ if (character_generated) {
+ do_cmd_redraw();
+ wakeup_event_loop();
+ return YES;
+ }
+ return NO;
+}
+
+/**
* Post a nonsense event so that our event loop wakes up
*/
static void wakeup_event_loop(void)
NSEnableScreenUpdates();
- if (mainTerm == 0 && game_in_progress && character_generated) {
- /* Mimics the logic in setGraphicsMode(). */
- do_cmd_redraw();
- wakeup_event_loop();
- } else {
+ if (mainTerm != 0 || ! redraw_for_tiles_or_term0_font()) {
[(id)angbandContext requestRedraw];
}
}
arg_bigtile = TRUE;
}
- if (game_in_progress && character_generated)
- {
- if (arg_bigtile != use_bigtile) {
- Term_activate(angband_term[0]);
- Term_resize(angband_term[0]->wid, angband_term[0]->hgt);
- }
-
- /* Hack -- Force redraw */
- do_cmd_redraw();
-
- /* Wake up the event loop so it notices the change */
- wakeup_event_loop();
+ if (arg_bigtile != use_bigtile) {
+ Term_activate(angband_term[0]);
+ Term_resize(angband_term[0]->wid, angband_term[0]->hgt);
}
+ redraw_for_tiles_or_term0_font();
}
- (void)selectWindow: (id)sender
forKey:AngbandBigTileDefaultsKey];
if (graphics_are_enabled()) {
arg_bigtile = (is_on) ? FALSE : TRUE;
- /* Mimics the logic in setGraphicsMode(). */
- if (game_in_progress && character_generated &&
- arg_bigtile != use_bigtile) {
+ if (arg_bigtile != use_bigtile) {
Term_activate(angband_term[0]);
Term_resize(angband_term[0]->wid, angband_term[0]->hgt);
- do_cmd_redraw();
- wakeup_event_loop();
+ redraw_for_tiles_or_term0_font();
}
}
}