Skip to content

Commit 6de427b

Browse files
authored
MacOS confirm quit, consuming meta key (#210)
1 parent d16542c commit 6de427b

4 files changed

Lines changed: 53 additions & 0 deletions

File tree

src/Client/ConfigWindow.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ public class ConfigWindow {
243243
private JCheckBox generalPanelLogTimestampsCheckbox;
244244
private JCheckBox generalPanelLogForceLevelCheckbox;
245245
private JCheckBox generalPanelPrefersXdgOpenCheckbox;
246+
private JCheckBox generalPanelMacOSConfirmQuitCheckBox;
246247
private JCheckBox generalPanelLogForceTimestampsCheckbox;
247248
private JCheckBox generalPanelDisableNatureRuneAlchCheckbox;
248249
private JCheckBox generalPanelCommandPatchQuestCheckbox;
@@ -1795,6 +1796,15 @@ public void stateChanged(ChangeEvent e) {
17951796
generalPanelPrefersXdgOpenCheckbox.setToolTipText(
17961797
"Does nothing on Windows or Mac, may improve URL opening experience on Linux");
17971798

1799+
if (Util.isMacOS()) {
1800+
generalPanelMacOSConfirmQuitCheckBox =
1801+
addCheckbox("Ask for confirmation when pressing cmd-Q on macOS", generalPanel);
1802+
generalPanelMacOSConfirmQuitCheckBox.setToolTipText(
1803+
"Prevents the application from immediately closing with cmd-Q by asking for confirmation");
1804+
SearchUtils.addSearchMetadata(
1805+
generalPanelMacOSConfirmQuitCheckBox, "command", "quit", "exit", "imac", "darwin");
1806+
}
1807+
17981808
generalPanelAutoScreenshotCheckbox =
17991809
addCheckbox("Take a screenshot when you level up or complete a quest", generalPanel);
18001810
generalPanelAutoScreenshotCheckbox.setToolTipText(
@@ -6285,6 +6295,10 @@ private void executeSynchronizeGuiValues() {
62856295
generalPanelLimitRanFPSSpinner.setValue(
62866296
Settings.RAN_EFFECT_TARGET_FPS.get(Settings.currentProfile));
62876297
generalPanelLimitFPSSpinner.setValue(Settings.FPS_LIMIT.get(Settings.currentProfile));
6298+
if (Util.isMacOS()) {
6299+
generalPanelMacOSConfirmQuitCheckBox.setSelected(
6300+
Settings.MACOS_CONFIRM_QUIT.get(Settings.currentProfile));
6301+
}
62886302
generalPanelAutoScreenshotCheckbox.setSelected(
62896303
Settings.AUTO_SCREENSHOT.get(Settings.currentProfile));
62906304
generalPanelPerCharScreenshotCheckbox.setSelected(
@@ -6826,6 +6840,10 @@ private void saveSettings() {
68266840
Settings.currentProfile, generalPanelShiftScrollCameraRotationCheckbox.isSelected());
68276841
Settings.TRACKPAD_ROTATION_SENSITIVITY.put(
68286842
Settings.currentProfile, generalPanelTrackpadRotationSlider.getValue());
6843+
if (Util.isMacOS()) {
6844+
Settings.MACOS_CONFIRM_QUIT.put(
6845+
Settings.currentProfile, generalPanelMacOSConfirmQuitCheckBox.isSelected());
6846+
}
68296847
Settings.AUTO_SCREENSHOT.put(
68306848
Settings.currentProfile, generalPanelAutoScreenshotCheckbox.isSelected());
68316849
Settings.PER_CHAR_SCREENSHOTS.put(

src/Client/Settings.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,7 @@ public class Settings {
151151
public static HashMap<String, RanOverrideEffectType> CUSTOM_RAN_CHAT_EFFECT =
152152
new HashMap<String, RanOverrideEffectType>();
153153
public static HashMap<String, Integer> RAN_EFFECT_TARGET_FPS = new HashMap<String, Integer>();
154+
public static HashMap<String, Boolean> MACOS_CONFIRM_QUIT = new HashMap<String, Boolean>();
154155
public static HashMap<String, Boolean> AUTO_SCREENSHOT = new HashMap<String, Boolean>();
155156
public static HashMap<String, Boolean> PER_CHAR_SCREENSHOTS = new HashMap<String, Boolean>();
156157
public static HashMap<String, String> SCREENSHOTS_STORAGE_PATH = new HashMap<String, String>();
@@ -965,6 +966,8 @@ public static void definePresets(Properties props) {
965966
VIEW_DISTANCE.put("all", 20000);
966967
VIEW_DISTANCE.put("custom", getPropInt(props, "view_distance", VIEW_DISTANCE.get("default")));
967968

969+
defineStaticPreset(MACOS_CONFIRM_QUIT, getPropBoolean(props, "macos_confirm_quit", true));
970+
968971
AUTO_SCREENSHOT.put("vanilla", true);
969972
AUTO_SCREENSHOT.put("vanilla_resizable", true);
970973
AUTO_SCREENSHOT.put("lite", true);
@@ -3754,6 +3757,7 @@ public static synchronized void save(String preset) {
37543757
"custom_ran_chat_effect", Integer.toString(CUSTOM_RAN_CHAT_EFFECT.get(preset).id()));
37553758
props.setProperty(
37563759
"ran_effect_target_fps", Integer.toString(RAN_EFFECT_TARGET_FPS.get(preset)));
3760+
props.setProperty("macos_confirm_quit", Boolean.toString(MACOS_CONFIRM_QUIT.get(preset)));
37573761
props.setProperty("auto_screenshot", Boolean.toString(AUTO_SCREENSHOT.get(preset)));
37583762
props.setProperty("per_char_screenshots", Boolean.toString(PER_CHAR_SCREENSHOTS.get(preset)));
37593763
props.setProperty("screenshots_storage_path", SCREENSHOTS_STORAGE_PATH.get(preset));

src/Game/KeyboardHandler.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import Client.KeybindSet;
2222
import Client.KeybindSet.KeyModifier;
2323
import Client.Settings;
24+
import Client.Util;
2425
import java.awt.event.KeyEvent;
2526
import java.awt.event.KeyListener;
2627
import java.util.ArrayList;
@@ -103,6 +104,11 @@ public void keyPressed(KeyEvent e) {
103104
}
104105
}
105106

107+
// Handle ⌘ modifier on macOS
108+
} else if (e.isMetaDown() && Util.isMacOS()) {
109+
// Not supported for keybinds, so always consume
110+
e.consume();
111+
106112
// Handle all other keys
107113
} else {
108114
for (KeybindSet kbs : keybindSetList) {

src/Game/MacOSHandler.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,17 @@
2020

2121
import Client.ConfigWindow;
2222
import Client.Launcher;
23+
import Client.Settings;
24+
import Client.Util;
2325
import com.apple.eawt.AboutHandler;
2426
import com.apple.eawt.AppEvent;
2527
import com.apple.eawt.Application;
2628
import com.apple.eawt.QuitHandler;
2729
import com.apple.eawt.QuitResponse;
2830
import java.awt.event.WindowEvent;
2931
import javax.swing.JFrame;
32+
import javax.swing.JOptionPane;
33+
import javax.swing.JPanel;
3034

3135
/** macOS-specific application handling */
3236
public class MacOSHandler implements QuitHandler, AboutHandler {
@@ -67,6 +71,27 @@ public void handleAbout(AppEvent.AboutEvent aboutEvent) {
6771
@Override
6872
public void handleQuitRequestWith(AppEvent.QuitEvent quitEvent, QuitResponse quitResponse) {
6973
// Used to handle the macOS ⌘Q event, to replicate the same behavior as closing the window
74+
if (Settings.MACOS_CONFIRM_QUIT.get(Settings.currentProfile)) {
75+
final Object[] options = {"Yes", "No"};
76+
JPanel confirmQuitPanel =
77+
Util.createOptionMessagePanel("Really quit " + Launcher.binaryPrefix + "RSCPlus?");
78+
int choice =
79+
JOptionPane.showOptionDialog(
80+
Launcher.getInstance(),
81+
confirmQuitPanel, // message
82+
"Confirm Quit", // title
83+
JOptionPane.YES_NO_OPTION,
84+
JOptionPane.QUESTION_MESSAGE,
85+
null,
86+
options,
87+
options[1]);
88+
89+
if (choice == JOptionPane.CLOSED_OPTION || choice == JOptionPane.NO_OPTION) {
90+
quitResponse.cancelQuit();
91+
return;
92+
}
93+
}
94+
7095
gameFrame.dispatchEvent(new WindowEvent(gameFrame, WindowEvent.WINDOW_CLOSING));
7196
}
7297
}

0 commit comments

Comments
 (0)