3838#import " HIDJoysticks.h"
3939
4040#import " ScalerNameToIdTransformer.h"
41+ #import " ScalerSupportsScanlines.h"
4142#import " MachineScalerIsEnabled.h"
4243#import " MachineNameToIdTransformer.h"
4344#import " VolumeSliderToPrefTransformer.h"
@@ -62,6 +63,7 @@ @implementation PreferencesController
6263+(void ) initialize
6364{
6465 ScalerNameToIdTransformer *sNToITransformer ;
66+ ScalerSupportsScanlines *scalerSupportsScanlines;
6567 MachineScalerIsEnabled *machineScalerIsEnabled;
6668 MachineNameToIdTransformer *mToITransformer;
6769 VolumeSliderToPrefTransformer *vsToPTransformer;
@@ -71,6 +73,11 @@ +(void) initialize
7173 [NSValueTransformer setValueTransformer: sNToITransformer
7274 forName: @" ScalerNameToIdTransformer" ];
7375
76+ scalerSupportsScanlines = [[[ScalerSupportsScanlines alloc ] init ] autorelease ];
77+
78+ [NSValueTransformer setValueTransformer: scalerSupportsScanlines
79+ forName: @" ScalerSupportsScanlines" ];
80+
7481 machineScalerIsEnabled = [MachineScalerIsEnabled
7582 machineScalerIsEnabledWithInt: 1 ];
7683
@@ -92,6 +99,12 @@ +(void) initialize
9299
93100 [NSValueTransformer setValueTransformer: vsToPTransformer
94101 forName: @" VolumeSliderToPrefTransformer" ];
102+
103+ /* Force the saved bilinear flag off so the disabled Bilinear checkbox
104+ shows as unchecked rather than checked-but-greyed for users upgrading
105+ from a build where they had enabled it. Drop this when the TODO in
106+ DisplayOpenGLView.m re-enables the setting. */
107+ [[NSUserDefaults standardUserDefaults ] setBool: NO forKey: @" bilinear" ];
95108}
96109
97110- (void )windowDidLoad
@@ -138,6 +151,12 @@ - (void)awakeFromNib
138151 NSToolbarItem *item = [[toolbar items ] objectAtIndex: [defaults integerForKey: @" preferencestab" ]];
139152 [toolbar setSelectedItemIdentifier: [item itemIdentifier ]];
140153 [self selectPrefPanel: item];
154+
155+ /* The xib's static enabled="NO" attribute is silently dropped by ibtool
156+ for buttons with a value binding (the compiled nib has NSEnabled=true),
157+ so disable it here instead. Drop this when the TODO in
158+ DisplayOpenGLView.m re-enables bilinear filtering. */
159+ [bilinearCheckbox setEnabled: NO ];
141160}
142161
143162- (void )showWindow : (id )sender
@@ -218,8 +237,25 @@ - (void)handleWillClose:(NSNotification *)note
218237 // B&W TV status may have changed
219238 display_refresh_all ();
220239
221- if ( ( ( current_scaler != scaler_get_type (settings_current.start_scaler_mode ) )
222- && !scaler_select_id (settings_current.start_scaler_mode ) ) ||
240+ scaler_type prev_scaler = current_scaler;
241+
242+ /* Skip silently for unknown ids (e.g. defaults written by an older build
243+ with a now-removed scaler) rather than show ui_error from
244+ scaler_select_id every time Preferences closes. */
245+ int new_scaler = scaler_get_type ( settings_current.start_scaler_mode );
246+ if ( new_scaler >= 0 ) {
247+ /* scaler_select_scaler is a no-op when the requested scaler is already
248+ current; if it isn't supported on the current machine it returns
249+ non-zero and current_scaler is left unchanged. When the scaler does
250+ change, the hotswap inside picks up the new bilinear setting via
251+ createTexture, so no separate hotswap call is needed for that path. */
252+ scaler_select_scaler ( new_scaler );
253+ }
254+
255+ /* For bilinear-only changes, the hotswap inside scaler_select_scaler
256+ didn't fire; trigger one explicitly so createTexture picks up the new
257+ filter. */
258+ if ( current_scaler == prev_scaler &&
223259 old_bilinear != settings_current.bilinear_filter ) {
224260 uidisplay_hotswap_gfx_mode ();
225261 }
0 commit comments