Skip to content

Commit 7bd6c10

Browse files
Added Monitor Selector to Video Options thanks to xCollateral/VulkanMod#618
1 parent 796f867 commit 7bd6c10

8 files changed

Lines changed: 181 additions & 6 deletions

File tree

src/client/java/io/github/amiralimollaei/mods/notenoughvulkan/NotEnoughVulkanClientMod.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
import net.caffeinemc.caffeineconfig.CaffeineConfig;
55
import net.fabricmc.loader.api.FabricLoader;
66
import net.vulkanmod.config.Platform;
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
79

810
import java.util.Arrays;
911

1012
public class NotEnoughVulkanClientMod {
13+
public static final Logger LOGGER = LoggerFactory.getLogger("not-enough-vulkan");
1114
private static NotEnoughVulkanGameOptions CONFIG;
1215
private static CaffeineConfig MIXIN_CONFIG;
1316

@@ -34,6 +37,8 @@ public static CaffeineConfig mixinConfig() {
3437
.addMixinOption("compat", true, false)
3538
.addMixinOption("compat.bobby", packageExists("de.johni0702.minecraft.bobby"), false)
3639
.addMixinOption("compat.skip_wayland_patches", Platform.isWayLand())
40+
.addMixinOption("enhance",true, false)
41+
.addMixinOption("enhance.monitor_selector",true)
3742

3843
//.withInfoUrl("https://github.com/amiralimollaei/not-enough-vulkan/wiki/Configuration-File")
3944
.build(FabricLoader.getInstance().getConfigDir().resolve("not-enough-vulkan.properties"));

src/client/java/io/github/amiralimollaei/mods/notenoughvulkan/config/NotEnoughVulkanGameOptions.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ public void writeChanges() {
6363

6464
public static class VulkanSettings {
6565
public boolean skipWaylandPatches;
66+
public String monitor;
6667

6768
public VulkanSettings() {
6869
this.skipWaylandPatches = false;
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
package io.github.amiralimollaei.mods.notenoughvulkan.gui;
2+
3+
import io.github.amiralimollaei.mods.notenoughvulkan.NotEnoughVulkanClientMod;
4+
import net.vulkanmod.config.video.VideoModeManager;
5+
import net.vulkanmod.config.video.VideoModeSet;
6+
7+
import java.util.ArrayList;
8+
import java.util.List;
9+
10+
import static org.lwjgl.glfw.GLFW.*;
11+
12+
/// [source](https://github.com/xCollateral/VulkanMod/pull/618)
13+
public class ExtendedVideoModeManager extends VideoModeManager {
14+
private static Long[] monitors;
15+
private static long selectedMonitor;
16+
private static VideoModeSet.VideoMode osVideoMode;
17+
private static VideoModeSet[] videoModeSets;
18+
19+
public static Long[] populateMonitors() {
20+
List<Long> monitors = new ArrayList<>();
21+
22+
var monitorsRaw = glfwGetMonitors();
23+
for (int i = 0; i < monitorsRaw.limit(); i++) {
24+
var m = monitorsRaw.get(i);
25+
monitors.add(m);
26+
}
27+
28+
Long[] arr = new Long[monitors.size()];
29+
monitors.toArray(arr);
30+
31+
return arr;
32+
}
33+
34+
public static Long[] getMonitors() {
35+
return monitors;
36+
}
37+
38+
public static long getSelectedMonitor() {
39+
return selectedMonitor;
40+
}
41+
42+
public static void setSelectedMonitor(long new_monitor) {
43+
selectedMonitor = new_monitor;
44+
osVideoMode = getCurrentVideoMode(selectedMonitor);
45+
videoModeSets = populateVideoResolutions(selectedMonitor);
46+
selectedVideoMode = getFirstAvailable().getVideoMode();
47+
}
48+
49+
public static void applySelectedMonitor() {
50+
NotEnoughVulkanClientMod.options().vulkanSettings.monitor = glfwGetMonitorName(selectedMonitor);
51+
}
52+
53+
public static void extendedInit() {
54+
monitors = populateMonitors();
55+
setSelectedMonitor(glfwGetPrimaryMonitor());
56+
}
57+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package io.github.amiralimollaei.mods.notenoughvulkan.mixin.enhance.monitor_selector;
2+
3+
import com.llamalad7.mixinextras.lib.apache.commons.ArrayUtils;
4+
import io.github.amiralimollaei.mods.notenoughvulkan.gui.ExtendedVideoModeManager;
5+
import net.minecraft.network.chat.Component;
6+
import net.vulkanmod.config.option.CyclingOption;
7+
import net.vulkanmod.config.option.Option;
8+
import net.vulkanmod.config.option.Options;
9+
import net.vulkanmod.config.video.VideoModeManager;
10+
import net.vulkanmod.config.video.VideoModeSet;
11+
import org.spongepowered.asm.mixin.Mixin;
12+
import org.spongepowered.asm.mixin.Shadow;
13+
import org.spongepowered.asm.mixin.injection.*;
14+
15+
import static org.lwjgl.glfw.GLFW.glfwGetMonitorName;
16+
17+
@Mixin(value = Options.class, remap = false)
18+
public class OptionsMixin {
19+
@Shadow
20+
static net.minecraft.client.Options minecraftOptions;
21+
22+
@Shadow
23+
public static boolean fullscreenDirty;
24+
25+
@ModifyArg(
26+
method = "getVideoOpts",
27+
at = @At(
28+
value = "INVOKE",
29+
target = "Lnet/vulkanmod/config/gui/OptionBlock;<init>(Ljava/lang/String;[Lnet/vulkanmod/config/option/Option;)V",
30+
ordinal = 0
31+
)
32+
)
33+
private static Option[] notenoughvuklan$addExtraVideoOpts(Option[] options) {
34+
/// [source](https://github.com/xCollateral/VulkanMod/pull/618)
35+
CyclingOption<VideoModeSet> resolutionOption = (CyclingOption<VideoModeSet>) options[0];
36+
CyclingOption<Long> monitorOption = new CyclingOption<Long>(
37+
Component.translatable("not-enough-vulkan.option.monitor"),
38+
ExtendedVideoModeManager.getMonitors(),
39+
(value) -> {
40+
ExtendedVideoModeManager.setSelectedMonitor(value);
41+
ExtendedVideoModeManager.applySelectedMonitor();
42+
VideoModeManager.applySelectedVideoMode();
43+
44+
if (minecraftOptions.fullscreen().get()) fullscreenDirty = true;
45+
46+
resolutionOption.setValues(VideoModeManager.getVideoResolutions());
47+
resolutionOption.setNewValue(VideoModeManager.getFirstAvailable());
48+
},
49+
ExtendedVideoModeManager::getSelectedMonitor
50+
);
51+
monitorOption.setTranslator(monitor_address -> Component.nullToEmpty(glfwGetMonitorName(monitor_address)));
52+
return ArrayUtils.add(options, 0, monitorOption);
53+
}
54+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package io.github.amiralimollaei.mods.notenoughvulkan.mixin.enhance.monitor_selector;
2+
3+
import io.github.amiralimollaei.mods.notenoughvulkan.gui.ExtendedVideoModeManager;
4+
import net.vulkanmod.config.video.VideoModeManager;
5+
import org.spongepowered.asm.mixin.Mixin;
6+
import org.spongepowered.asm.mixin.injection.At;
7+
import org.spongepowered.asm.mixin.injection.Inject;
8+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
9+
10+
@Mixin(value = VideoModeManager.class, remap = false)
11+
public class VideoModeManagerMixin {
12+
@Inject(method = "init", at = @At("TAIL"))
13+
private static void notenoughvulkan$extendedInit(CallbackInfo ci) {
14+
ExtendedVideoModeManager.extendedInit();
15+
}
16+
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package io.github.amiralimollaei.mods.notenoughvulkan.mixin.enhance.monitor_selector;
2+
3+
import com.bawnorton.mixinsquared.TargetHandler;
4+
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
5+
import com.mojang.blaze3d.platform.Window;
6+
import io.github.amiralimollaei.mods.notenoughvulkan.NotEnoughVulkanClientMod;
7+
import io.github.amiralimollaei.mods.notenoughvulkan.gui.ExtendedVideoModeManager;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.injection.At;
10+
11+
import java.util.Arrays;
12+
13+
import static org.lwjgl.glfw.GLFW.glfwGetMonitorName;
14+
15+
@Mixin(value = Window.class, remap = false, priority = 1500)
16+
public class WindowMixinMixin {
17+
@TargetHandler(
18+
mixin = "net.vulkanmod.mixin.window.WindowMixin",
19+
name = "setMode"
20+
)
21+
@ModifyExpressionValue(
22+
method = "@MixinSquared:Handler",
23+
at = @At(
24+
value = "INVOKE",
25+
target = "Lorg/lwjgl/glfw/GLFW;glfwGetPrimaryMonitor()J"
26+
)
27+
)
28+
private long recoverMonitorPointer(long original) {
29+
/// [source](https://github.com/xCollateral/VulkanMod/pull/618)
30+
long monitor = Arrays.stream(ExtendedVideoModeManager.getMonitors())
31+
.filter(v -> {
32+
String monitorName = glfwGetMonitorName(v);
33+
if (monitorName == null) return false;
34+
return monitorName.equals(NotEnoughVulkanClientMod.options().vulkanSettings.monitor);
35+
})
36+
.findFirst().orElse(original);
37+
ExtendedVideoModeManager.setSelectedMonitor(monitor); // refresh video mode manager
38+
return monitor;
39+
}
40+
}

src/client/resources/assets/not-enough-vulkan/lang/en_us.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,7 @@
375375
"sodium-extra.overlay.fps_extended": "(avg. %s / 1%% low %s / 0.1%% low %s)",
376376
"sodium-extra.overlay.light_updates": "Light updates disabled",
377377
"sodium-extra.units.ticks": "%s tick(s)",
378+
"not-enough-vulkan.option.monitor": "Monitor",
378379
"not-enough-vulkan.option.skip_wayland_patches": "Skip Wayland Patches",
379380
"not-enough-vulkan.option.skip_wayland_patches.tooltip": "Skips wayland compatibility patches on linux to enable custom GLFW workarounds (only available when using wayland), Some effects require a restart."
380381
}

src/client/resources/not-enough-vulkan.mixins.json

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,14 @@
88
"client": [
99
"compat.bobby.FakeChunkManagerMixin",
1010
"compat.bobby.OptionsMixin",
11-
"core.VOptionScreenMixin"
11+
"compat.skip_wayland_patches.InputConstantsMMixin",
12+
"compat.skip_wayland_patches.MinecraftMixinMixin",
13+
"core.VOptionScreenMixin",
14+
"enhance.monitor_selector.OptionsMixin",
15+
"enhance.monitor_selector.VideoModeManagerMixin",
16+
"enhance.monitor_selector.WindowMixinMixin"
1217
],
1318
"injectors": {
1419
"defaultRequire": 1
15-
},
16-
"mixins": [
17-
"compat.skip_wayland_patches.InputConstantsMMixin",
18-
"compat.skip_wayland_patches.MinecraftMixinMixin"
19-
]
20+
}
2021
}

0 commit comments

Comments
 (0)