From 971decb35c7531257c089929f7440de07fe760bf Mon Sep 17 00:00:00 2001 From: Matteo Hausner Date: Tue, 8 Oct 2024 13:24:46 +0200 Subject: [PATCH] Convert VjoyInterface from JNA interface to direct mapping --- .../bwravencl/controllerbuddy/gui/Main.java | 28 +++++- .../runmode/OutputRunMode.java | 89 +++++++++--------- .../runmode/VjoyInterface.java | 93 +++++++++++-------- src/main/resources/strings.properties | 2 + src/main/resources/strings_de_DE.properties | 2 + 5 files changed, 125 insertions(+), 89 deletions(-) diff --git a/src/main/java/de/bwravencl/controllerbuddy/gui/Main.java b/src/main/java/de/bwravencl/controllerbuddy/gui/Main.java index bd440894..bd7e62e0 100644 --- a/src/main/java/de/bwravencl/controllerbuddy/gui/Main.java +++ b/src/main/java/de/bwravencl/controllerbuddy/gui/Main.java @@ -49,6 +49,7 @@ import de.bwravencl.controllerbuddy.runmode.OutputRunMode; import de.bwravencl.controllerbuddy.runmode.RunMode; import de.bwravencl.controllerbuddy.runmode.ServerRunMode; +import de.bwravencl.controllerbuddy.runmode.VjoyInterface; import de.bwravencl.controllerbuddy.util.RunnableWithDefaultExceptionHandler; import de.bwravencl.controllerbuddy.util.VersionUtils; import java.awt.AWTException; @@ -3801,15 +3802,32 @@ public void actionPerformed(final ActionEvent e) { final var vjoyDirectory = vJoyDirectoryFileChooser.getSelectedFile(); final var dllFile = new File(vjoyDirectory, OutputRunMode.getVJoyArchFolderName() + File.separator + OutputRunMode.VJOY_LIBRARY_FILENAME); - if (dllFile.exists()) { - final var vjoyPath = vjoyDirectory.getAbsolutePath(); - preferences.put(PREFERENCES_VJOY_DIRECTORY, vjoyPath); - vJoyDirectoryLabel.setText(vjoyPath); - } else { + if (!dllFile.exists()) { GuiUtils.showMessageDialog(main, frame, MessageFormat.format(strings.getString("INVALID_VJOY_DIRECTORY_DIALOG_TEXT"), OutputRunMode.getDefaultVJoyPath()), strings.getString("ERROR_DIALOG_TITLE"), JOptionPane.ERROR_MESSAGE); + return; + } + + final var oldVjoyPath = getVJoyDirectory(); + final var newVjoyPath = vjoyDirectory.getAbsolutePath(); + + if (Objects.equals(oldVjoyPath, newVjoyPath)) { + return; + } + + preferences.put(PREFERENCES_VJOY_DIRECTORY, newVjoyPath); + vJoyDirectoryLabel.setText(newVjoyPath); + + if (VjoyInterface.isRegistered() + && JOptionPane.showConfirmDialog(frame, + MessageFormat.format(strings.getString("RESTART_REQUIRED_DIALOG_TEXT"), + Constants.APPLICATION_NAME), + strings.getString("INFORMATION_DIALOG_TITLE"), + JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) { + handleUnsavedChanges(); + quit(); } } } diff --git a/src/main/java/de/bwravencl/controllerbuddy/runmode/OutputRunMode.java b/src/main/java/de/bwravencl/controllerbuddy/runmode/OutputRunMode.java index 6fef43da..3d4fd38f 100644 --- a/src/main/java/de/bwravencl/controllerbuddy/runmode/OutputRunMode.java +++ b/src/main/java/de/bwravencl/controllerbuddy/runmode/OutputRunMode.java @@ -17,7 +17,6 @@ package de.bwravencl.controllerbuddy.runmode; import com.sun.jna.IntegerType; -import com.sun.jna.Native; import com.sun.jna.Platform; import com.sun.jna.platform.win32.Advapi32Util; import com.sun.jna.platform.win32.Kernel32; @@ -77,9 +76,8 @@ public abstract class OutputRunMode extends RunMode { public static final int VJOY_DEFAULT_DEVICE = 1; + public static final String VJOY_LIBRARY_FILENAME = VjoyInterface.VJOY_LIBRARY_NAME + ".dll"; private static final Logger log = Logger.getLogger(OutputRunMode.class.getName()); - private static final String VJOY_LIBRARY_NAME = "vJoyInterface"; - public static final String VJOY_LIBRARY_FILENAME = VJOY_LIBRARY_NAME + ".dll"; private static final String VJOY_UNINSTALL_REGISTRY_KEY = "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{8E31F76F-74C3-47F1-9550-E041EEDC5FBB}_is1"; private static final String VJOY_INSTALL_LOCATION_REGISTRY_VALUE = "InstallLocation"; private static final long MOUSEEVENTF_MOVE = 0x0001L; @@ -114,7 +112,6 @@ public abstract class OutputRunMode extends RunMode { + "leds"; private static final String SYSFS_INPUT_DIR_REGEX_PREFIX = "input\\d+::"; private static final String SYSFS_BRIGHTNESS_FILENAME = "brightness"; - private static VjoyInterface vJoy; final Set oldDownMouseButtons = new HashSet<>(); final Set newUpMouseButtons = new HashSet<>(); final Set newDownMouseButtons = new HashSet<>(); @@ -198,10 +195,6 @@ public static String getVJoyArchFolderName() { } } - private static void setVJoy(final VjoyInterface vJoy) { - OutputRunMode.vJoy = vJoy; - } - static void updateOutputSets(final Set sourceSet, final Set oldDownSet, final Set newUpSet, final Set newDownSet, final boolean keepStillDown) { final var stillDownSet = new HashSet(); @@ -279,10 +272,12 @@ final void deInit() { } } - if (Main.isWindows && vJoy != null) { - vJoy.ResetButtons(vJoyDevice); - vJoy.ResetVJD(vJoyDevice); - vJoy.RelinquishVJD(vJoyDevice); + if (Main.isWindows) { + if (VjoyInterface.isRegistered()) { + VjoyInterface.ResetButtons(vJoyDevice); + VjoyInterface.ResetVJD(vJoyDevice); + VjoyInterface.RelinquishVJD(vJoyDevice); + } EventQueue.invokeLater(() -> main.setStatusBarText(MessageFormat .format(Main.strings.getString("STATUS_DISCONNECTED_FROM_VJOY_DEVICE"), vJoyDevice.intValue()))); @@ -428,9 +423,9 @@ final boolean init() { log.log(Level.INFO, "Using vJoy library path: " + libraryPath); System.setProperty("jna.library.path", libraryPath); - setVJoy(Native.load(VJOY_LIBRARY_NAME, VjoyInterface.class)); + VjoyInterface.register(); - if (!vJoy.vJoyEnabled().booleanValue()) { + if (!VjoyInterface.vJoyEnabled().booleanValue()) { log.log(Level.WARNING, "vJoy driver is not enabled"); EventQueue.invokeLater(() -> GuiUtils.showMessageDialog(main, main.getFrame(), Main.strings.getString("VJOY_DRIVER_NOT_ENABLED_DIALOG_TEXT"), @@ -440,7 +435,7 @@ final boolean init() { final var dllVersion = new WORDByReference(); final var drvVersion = new WORDByReference(); - if (!vJoy.DriverMatch(dllVersion, drvVersion).booleanValue()) { + if (!VjoyInterface.DriverMatch(dllVersion, drvVersion).booleanValue()) { log.log(Level.WARNING, "vJoy DLL version " + dllVersion + " does not match driver version " + drvVersion); EventQueue.invokeLater(() -> GuiUtils.showMessageDialog(main, main.getFrame(), @@ -452,7 +447,7 @@ final boolean init() { log.log(Level.INFO, "Using vJoy device: " + vJoyDevice.toString()); - if (vJoy.GetVJDStatus(vJoyDevice) != VjoyInterface.VJD_STAT_FREE) { + if (VjoyInterface.GetVJDStatus(vJoyDevice) != VjoyInterface.VJD_STAT_FREE) { log.log(Level.WARNING, "vJoy device is not available"); EventQueue.invokeLater(() -> GuiUtils.showMessageDialog(main, main.getFrame(), MessageFormat.format(Main.strings.getString("INVALID_VJOY_DEVICE_STATUS_DIALOG_TEXT"), @@ -461,14 +456,22 @@ final boolean init() { return false; } - final var hasAxisX = vJoy.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_X).booleanValue(); - final var hasAxisY = vJoy.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_Y).booleanValue(); - final var hasAxisZ = vJoy.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_Z).booleanValue(); - final var hasAxisRX = vJoy.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_RX).booleanValue(); - final var hasAxisRY = vJoy.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_RY).booleanValue(); - final var hasAxisRZ = vJoy.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_RZ).booleanValue(); - final var hasAxisSL0 = vJoy.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_SL0).booleanValue(); - final var hasAxisSL1 = vJoy.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_SL1).booleanValue(); + final var hasAxisX = VjoyInterface.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_X) + .booleanValue(); + final var hasAxisY = VjoyInterface.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_Y) + .booleanValue(); + final var hasAxisZ = VjoyInterface.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_Z) + .booleanValue(); + final var hasAxisRX = VjoyInterface.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_RX) + .booleanValue(); + final var hasAxisRY = VjoyInterface.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_RY) + .booleanValue(); + final var hasAxisRZ = VjoyInterface.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_RZ) + .booleanValue(); + final var hasAxisSL0 = VjoyInterface.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_SL0) + .booleanValue(); + final var hasAxisSL1 = VjoyInterface.GetVJDAxisExist(vJoyDevice, VjoyInterface.HID_USAGE_SL1) + .booleanValue(); if (!hasAxisX || !hasAxisY || !hasAxisZ || !hasAxisRX || !hasAxisRY || !hasAxisRZ || !hasAxisSL0 || !hasAxisSL1) { final var missingAxes = new ArrayList(); @@ -506,7 +509,7 @@ final boolean init() { return false; } - if (!vJoy.AcquireVJD(vJoyDevice).booleanValue()) { + if (!VjoyInterface.AcquireVJD(vJoyDevice).booleanValue()) { log.log(Level.WARNING, "Could not acquire vJoy device"); EventQueue.invokeLater(() -> GuiUtils.showMessageDialog(main, main.getFrame(), MessageFormat.format(Main.strings.getString("COULD_NOT_ACQUIRE_VJOY_DEVICE_DIALOG_TEXT"), @@ -515,7 +518,7 @@ final boolean init() { return false; } - if (!vJoy.ResetVJD(vJoyDevice).booleanValue()) { + if (!VjoyInterface.ResetVJD(vJoyDevice).booleanValue()) { log.log(Level.WARNING, "Could not reset vJoy device"); EventQueue.invokeLater(() -> GuiUtils.showMessageDialog(main, main.getFrame(), MessageFormat.format(Main.strings.getString("COULD_NOT_RESET_VJOY_DEVICE_DIALOG_TEXT"), @@ -525,14 +528,14 @@ final boolean init() { } final var Min = new LONGByReference(); - vJoy.GetVJDAxisMin(vJoyDevice, VjoyInterface.HID_USAGE_X, Min); + VjoyInterface.GetVJDAxisMin(vJoyDevice, VjoyInterface.HID_USAGE_X, Min); minAxisValue = Min.getValue().intValue(); final var Max = new LONGByReference(); - vJoy.GetVJDAxisMax(vJoyDevice, VjoyInterface.HID_USAGE_X, Max); + VjoyInterface.GetVJDAxisMax(vJoyDevice, VjoyInterface.HID_USAGE_X, Max); maxAxisValue = Max.getValue().intValue(); - nButtons = vJoy.GetVJDButtonNumber(vJoyDevice); + nButtons = VjoyInterface.GetVJDButtonNumber(vJoyDevice); if (!enoughButtons(nButtons)) { return false; } @@ -713,7 +716,7 @@ final void writeOutput() { try { if (axisX.isChanged()) { if (Main.isWindows) { - writeSucessful &= vJoy.SetAxis(axisX.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_X) + writeSucessful &= VjoyInterface.SetAxis(axisX.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_X) .booleanValue(); } else if (Main.isLinux) { joystickInputDevice.emit(new Event(EventCode.ABS_X, axisX.getUinputValue())); @@ -726,7 +729,7 @@ final void writeOutput() { if (axisY.isChanged()) { if (Main.isWindows) { - writeSucessful &= vJoy.SetAxis(axisY.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_Y) + writeSucessful &= VjoyInterface.SetAxis(axisY.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_Y) .booleanValue(); } else if (Main.isLinux) { joystickInputDevice.emit(new Event(EventCode.ABS_Y, axisY.getUinputValue())); @@ -739,7 +742,7 @@ final void writeOutput() { if (axisZ.isChanged()) { if (Main.isWindows) { - writeSucessful &= vJoy.SetAxis(axisZ.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_Z) + writeSucessful &= VjoyInterface.SetAxis(axisZ.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_Z) .booleanValue(); } else if (Main.isLinux) { joystickInputDevice.emit(new Event(EventCode.ABS_Z, axisZ.getUinputValue())); @@ -752,8 +755,8 @@ final void writeOutput() { if (axisRX.isChanged()) { if (Main.isWindows) { - writeSucessful &= vJoy.SetAxis(axisRX.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_RX) - .booleanValue(); + writeSucessful &= VjoyInterface + .SetAxis(axisRX.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_RX).booleanValue(); } else if (Main.isLinux) { joystickInputDevice.emit(new Event(EventCode.ABS_RX, axisRX.getUinputValue())); } else { @@ -765,8 +768,8 @@ final void writeOutput() { if (axisRY.isChanged()) { if (Main.isWindows) { - writeSucessful &= vJoy.SetAxis(axisRY.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_RY) - .booleanValue(); + writeSucessful &= VjoyInterface + .SetAxis(axisRY.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_RY).booleanValue(); } else if (Main.isLinux) { joystickInputDevice.emit(new Event(EventCode.ABS_RY, axisRY.getUinputValue())); } else { @@ -778,8 +781,8 @@ final void writeOutput() { if (axisRZ.isChanged()) { if (Main.isWindows) { - writeSucessful &= vJoy.SetAxis(axisRZ.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_RZ) - .booleanValue(); + writeSucessful &= VjoyInterface + .SetAxis(axisRZ.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_RZ).booleanValue(); } else if (Main.isLinux) { joystickInputDevice.emit(new Event(EventCode.ABS_RZ, axisRZ.getUinputValue())); } else { @@ -791,8 +794,8 @@ final void writeOutput() { if (axisS0.isChanged()) { if (Main.isWindows) { - writeSucessful &= vJoy.SetAxis(axisS0.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_SL0) - .booleanValue(); + writeSucessful &= VjoyInterface + .SetAxis(axisS0.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_SL0).booleanValue(); } else if (Main.isLinux) { joystickInputDevice.emit(new Event(EventCode.ABS_THROTTLE, axisS0.getUinputValue())); } else { @@ -804,8 +807,8 @@ final void writeOutput() { if (axisS1.isChanged()) { if (Main.isWindows) { - writeSucessful &= vJoy.SetAxis(axisS1.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_SL1) - .booleanValue(); + writeSucessful &= VjoyInterface + .SetAxis(axisS1.getvJoyValue(), vJoyDevice, VjoyInterface.HID_USAGE_SL1).booleanValue(); } else if (Main.isLinux) { joystickInputDevice.emit(new Event(EventCode.ABS_RUDDER, axisS1.getUinputValue())); } else { @@ -818,7 +821,7 @@ final void writeOutput() { for (var i = 0; i < buttons.length; i++) { if (buttons[i].isChanged()) { if (Main.isWindows) { - writeSucessful &= vJoy.SetBtn(buttons[i].getvJoyValue(), vJoyDevice, new UCHAR(i + 1)) + writeSucessful &= VjoyInterface.SetBtn(buttons[i].getvJoyValue(), vJoyDevice, new UCHAR(i + 1)) .booleanValue(); } else if (Main.isLinux) { joystickInputDevice diff --git a/src/main/java/de/bwravencl/controllerbuddy/runmode/VjoyInterface.java b/src/main/java/de/bwravencl/controllerbuddy/runmode/VjoyInterface.java index 26f66757..9f419998 100644 --- a/src/main/java/de/bwravencl/controllerbuddy/runmode/VjoyInterface.java +++ b/src/main/java/de/bwravencl/controllerbuddy/runmode/VjoyInterface.java @@ -16,7 +16,7 @@ package de.bwravencl.controllerbuddy.runmode; -import com.sun.jna.Library; +import com.sun.jna.Native; import com.sun.jna.platform.win32.WinDef.BOOL; import com.sun.jna.platform.win32.WinDef.DWORD; import com.sun.jna.platform.win32.WinDef.LONG; @@ -28,69 +28,80 @@ import com.sun.jna.platform.win32.WinDef.WORDByReference; @SuppressWarnings({ "UnusedReturnValue", "unused" }) -interface VjoyInterface extends Library { +public final class VjoyInterface { - UINT HID_USAGE_X = new UINT(0x30L); - UINT HID_USAGE_Y = new UINT(0x31L); - UINT HID_USAGE_Z = new UINT(0x32L); - UINT HID_USAGE_RX = new UINT(0x33L); - UINT HID_USAGE_RY = new UINT(0x34L); - UINT HID_USAGE_RZ = new UINT(0x35L); - UINT HID_USAGE_SL0 = new UINT(0x36L); - UINT HID_USAGE_SL1 = new UINT(0x37L); - UINT HID_USAGE_WHL = new UINT(0x38L); - UINT HID_USAGE_POV = new UINT(0x39L); - int VJD_STAT_OWN = 0; - int VJD_STAT_FREE = 1; - int VJD_STAT_BUSY = 2; - int VJD_STAT_MISS = 3; - int VJD_STAT_UNKN = 4; + static final UINT HID_USAGE_X = new UINT(0x30L); + static final UINT HID_USAGE_Y = new UINT(0x31L); + static final UINT HID_USAGE_Z = new UINT(0x32L); + static final UINT HID_USAGE_RX = new UINT(0x33L); + static final UINT HID_USAGE_RY = new UINT(0x34L); + static final UINT HID_USAGE_RZ = new UINT(0x35L); + static final UINT HID_USAGE_SL0 = new UINT(0x36L); + static final UINT HID_USAGE_SL1 = new UINT(0x37L); + static final UINT HID_USAGE_WHL = new UINT(0x38L); + static final UINT HID_USAGE_POV = new UINT(0x39L); + static final int VJD_STAT_OWN = 0; + static final int VJD_STAT_FREE = 1; + static final int VJD_STAT_BUSY = 2; + static final int VJD_STAT_MISS = 3; + static final int VJD_STAT_UNKN = 4; + static final String VJOY_LIBRARY_NAME = "vJoyInterface"; - BOOL AcquireVJD(UINT rID); + static native BOOL AcquireVJD(UINT rID); - BOOL DriverMatch(WORDByReference DllVer, WORDByReference DrvVer); + static native BOOL DriverMatch(WORDByReference DllVer, WORDByReference DrvVer); - BOOL GetVJDAxisExist(UINT rID, UINT Axis); + static native BOOL GetVJDAxisExist(UINT rID, UINT Axis); - BOOL GetVJDAxisMax(UINT rID, UINT Axis, LONGByReference Max); + static native BOOL GetVJDAxisMax(UINT rID, UINT Axis, LONGByReference Max); - BOOL GetVJDAxisMin(UINT rID, UINT Axis, LONGByReference Min); + static native BOOL GetVJDAxisMin(UINT rID, UINT Axis, LONGByReference Min); - int GetVJDButtonNumber(UINT rID); + static native int GetVJDButtonNumber(UINT rID); - int GetVJDContPovNumber(UINT rID); + static native int GetVJDContPovNumber(UINT rID); - int GetVJDDiscPovNumber(UINT rID); + static native int GetVJDDiscPovNumber(UINT rID); - int GetVJDStatus(UINT rID); + static native int GetVJDStatus(UINT rID); - PVOID GetvJoyManufacturerString(); + static native PVOID GetvJoyManufacturerString(); - PVOID GetvJoyProductString(); + static native PVOID GetvJoyProductString(); - PVOID GetvJoySerialNumberString(); + static native PVOID GetvJoySerialNumberString(); - SHORT GetvJoyVersion(); + static native SHORT GetvJoyVersion(); - void RelinquishVJD(UINT rID); + static native void RelinquishVJD(UINT rID); - void ResetAll(); + static native void ResetAll(); - BOOL ResetButtons(UINT rID); + static native BOOL ResetButtons(UINT rID); - BOOL ResetPovs(UINT rID); + static native BOOL ResetPovs(UINT rID); - BOOL ResetVJD(UINT rID); + static native BOOL ResetVJD(UINT rID); - BOOL SetAxis(LONG Value, UINT rID, UINT Axis); + static native BOOL SetAxis(LONG Value, UINT rID, UINT Axis); - BOOL SetBtn(BOOL Value, UINT rID, UCHAR nBtn); + static native BOOL SetBtn(BOOL Value, UINT rID, UCHAR nBtn); - BOOL SetContPov(DWORD Value, UINT rID, UCHAR nPov); + static native BOOL SetContPov(DWORD Value, UINT rID, UCHAR nPov); - BOOL SetDiscPov(int Value, UINT rID, UCHAR nPov); + static native BOOL SetDiscPov(int Value, UINT rID, UCHAR nPov); - BOOL UpdateVJD(UINT rID, PVOID pData); + static native BOOL UpdateVJD(UINT rID, PVOID pData); - BOOL vJoyEnabled(); + public static boolean isRegistered() { + return Native.registered(VjoyInterface.class); + } + + static void register() { + if (!isRegistered()) { + Native.register(VJOY_LIBRARY_NAME); + } + } + + static native BOOL vJoyEnabled(); } diff --git a/src/main/resources/strings.properties b/src/main/resources/strings.properties index 49b1945a..24181f13 100644 --- a/src/main/resources/strings.properties +++ b/src/main/resources/strings.properties @@ -226,6 +226,8 @@ UNKNOWN_ACTION_TYPES_DIALOG_TEXT = The Profile contains unknown action types!\n\ INVALID_VJOY_DIRECTORY_DIALOG_TEXT = Invalid vJoy directory!\n\nThe selected directory does not contain a valid vJoy installation.\nThe assumed installation location for vJoy is:\n{0}\n\nPlease retry. +RESTART_REQUIRED_DIALOG_TEXT = {0} must be restarted for the changes to take effect.\n\nDo you want to quit {0} now? + VJOY_VERSION_MISMATCH_DIALOG_TEXT = vJoy version mismatch!\n\nDLL version: {0,number,#}\nDriver version: {1,number,#}\n\nPlease verify that the selected vJoy directory matches the one of the vJoy driver currently in use. VJOY_DRIVER_NOT_ENABLED_DIALOG_TEXT = The vJoy driver is not enabled.\n\nPlease verify that the vJoy driver is installed correctly. diff --git a/src/main/resources/strings_de_DE.properties b/src/main/resources/strings_de_DE.properties index e2b043fb..701f229b 100644 --- a/src/main/resources/strings_de_DE.properties +++ b/src/main/resources/strings_de_DE.properties @@ -202,6 +202,8 @@ UNKNOWN_ACTION_TYPES_DIALOG_TEXT = Das Profil enthält unbekannte Aktionstypen!\ INVALID_VJOY_DIRECTORY_DIALOG_TEXT = Ungültiges vJoy Verzeichnis!\n\nDas gewählte Verzeichnis enthält keine gültige vJoy Installation.\nDer angenommene Installationsort von vJoy lautet:\n{0}\n\nBitte erneut versuchen. +RESTART_REQUIRED_DIALOG_TEXT = {0} muss neu gestartet werden, damit die Änderungen wirksam werden.\n\nSoll {0} jetzt beendet werden? + VJOY_VERSION_MISMATCH_DIALOG_TEXT = vJoy Versionskonflikt!\n\nDLL Version: {0,number,#}\nTreiber Version: {1,number,#}\n\nBitte überprüfen Sie, dass das ausgewählte vJoy Verzeichnis mit dem des momentan in Verwendung befindlichen vJoy Treibers übereinstimmt. VJOY_DRIVER_NOT_ENABLED_DIALOG_TEXT = Der vJoy Treiber ist nicht aktiv!\n\nBitte überprüfen Sie, dass der vJoy Treiber korrekt installiert ist.