97 lines
3.7 KiB
Java
97 lines
3.7 KiB
Java
package com.mojang.blaze3d.platform;
|
|
|
|
import org.lwjgl.glfw.GLFWMonitorCallback;
|
|
import org.lwjgl.glfw.GLFWMonitorCallbackI;
|
|
import it.unimi.dsi.fastutil.objects.ObjectIterator;
|
|
import javax.annotation.Nullable;
|
|
import org.lwjgl.PointerBuffer;
|
|
import org.lwjgl.glfw.GLFW;
|
|
import com.mojang.blaze3d.systems.RenderSystem;
|
|
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
|
|
import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
|
|
|
|
public class ScreenManager {
|
|
private final Long2ObjectMap<Monitor> monitors;
|
|
private final MonitorCreator monitorCreator;
|
|
|
|
public ScreenManager(final MonitorCreator dgr) {
|
|
this.monitors = (Long2ObjectMap<Monitor>)new Long2ObjectOpenHashMap();
|
|
RenderSystem.assertThread(RenderSystem::isInInitPhase);
|
|
this.monitorCreator = dgr;
|
|
GLFW.glfwSetMonitorCallback(this::onMonitorChange);
|
|
final PointerBuffer pointerBuffer3 = GLFW.glfwGetMonitors();
|
|
if (pointerBuffer3 != null) {
|
|
for (int integer4 = 0; integer4 < pointerBuffer3.limit(); ++integer4) {
|
|
final long long5 = pointerBuffer3.get(integer4);
|
|
this.monitors.put(long5, dgr.createMonitor(long5));
|
|
}
|
|
}
|
|
}
|
|
|
|
private void onMonitorChange(final long long1, final int integer) {
|
|
RenderSystem.assertThread(RenderSystem::isOnRenderThread);
|
|
if (integer == 262145) {
|
|
this.monitors.put(long1, this.monitorCreator.createMonitor(long1));
|
|
}
|
|
else if (integer == 262146) {
|
|
this.monitors.remove(long1);
|
|
}
|
|
}
|
|
|
|
@Nullable
|
|
public Monitor getMonitor(final long long1) {
|
|
RenderSystem.assertThread(RenderSystem::isInInitPhase);
|
|
return (Monitor)this.monitors.get(long1);
|
|
}
|
|
|
|
@Nullable
|
|
public Monitor findBestMonitor(final Window dgy) {
|
|
final long long3 = GLFW.glfwGetWindowMonitor(dgy.getWindow());
|
|
if (long3 != 0L) {
|
|
return this.getMonitor(long3);
|
|
}
|
|
final int integer5 = dgy.getX();
|
|
final int integer6 = integer5 + dgy.getScreenWidth();
|
|
final int integer7 = dgy.getY();
|
|
final int integer8 = integer7 + dgy.getScreenHeight();
|
|
int integer9 = -1;
|
|
Monitor dgq10 = null;
|
|
for (final Monitor dgq11 : this.monitors.values()) {
|
|
final int integer10 = dgq11.getX();
|
|
final int integer11 = integer10 + dgq11.getCurrentMode().getWidth();
|
|
final int integer12 = dgq11.getY();
|
|
final int integer13 = integer12 + dgq11.getCurrentMode().getHeight();
|
|
final int integer14 = clamp(integer5, integer10, integer11);
|
|
final int integer15 = clamp(integer6, integer10, integer11);
|
|
final int integer16 = clamp(integer7, integer12, integer13);
|
|
final int integer17 = clamp(integer8, integer12, integer13);
|
|
final int integer18 = Math.max(0, integer15 - integer14);
|
|
final int integer19 = Math.max(0, integer17 - integer16);
|
|
final int integer20 = integer18 * integer19;
|
|
if (integer20 > integer9) {
|
|
dgq10 = dgq11;
|
|
integer9 = integer20;
|
|
}
|
|
}
|
|
return dgq10;
|
|
}
|
|
|
|
public static int clamp(final int integer1, final int integer2, final int integer3) {
|
|
if (integer1 < integer2) {
|
|
return integer2;
|
|
}
|
|
if (integer1 > integer3) {
|
|
return integer3;
|
|
}
|
|
return integer1;
|
|
}
|
|
|
|
public void shutdown() {
|
|
RenderSystem.assertThread(RenderSystem::isOnRenderThread);
|
|
final GLFWMonitorCallback gLFWMonitorCallback2 = GLFW.glfwSetMonitorCallback((GLFWMonitorCallbackI)null);
|
|
if (gLFWMonitorCallback2 != null) {
|
|
gLFWMonitorCallback2.free();
|
|
}
|
|
}
|
|
}
|