Skip to content

Commit 564cb52

Browse files
authored
Merge pull request #318 from minecraft-dev/ungrab-mouse
Ungrab mouse when pausing while debugging
2 parents 6392e75 + 04f4265 commit 564cb52

File tree

5 files changed

+143
-28
lines changed

5 files changed

+143
-28
lines changed
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* Minecraft Dev for IntelliJ
3+
*
4+
* https://minecraftdev.org
5+
*
6+
* Copyright (c) 2017 minecraft-dev
7+
*
8+
* MIT License
9+
*/
10+
11+
package com.demonwav.mcdev.platform.mcp.debug
12+
13+
import com.demonwav.mcdev.facet.MinecraftFacet
14+
import com.demonwav.mcdev.platform.mcp.McpModuleType
15+
import com.demonwav.mcdev.util.ModuleDebugRunConfigurationExtension
16+
import com.intellij.debugger.DebuggerManager
17+
import com.intellij.debugger.engine.DebugProcess
18+
import com.intellij.debugger.engine.DebugProcessImpl
19+
import com.intellij.debugger.engine.DebugProcessListener
20+
import com.intellij.execution.process.ProcessHandler
21+
import com.intellij.openapi.module.Module
22+
23+
class McpRunConfigurationExtension : ModuleDebugRunConfigurationExtension(), DebugProcessListener {
24+
25+
override fun attachToProcess(handler: ProcessHandler, module: Module) {
26+
if (MinecraftFacet.getInstance(module)?.isOfType(McpModuleType) == true) {
27+
DebuggerManager.getInstance(module.project).addDebugProcessListener(handler, this)
28+
}
29+
}
30+
31+
override fun processAttached(process: DebugProcess) {
32+
if (process !is DebugProcessImpl) {
33+
return
34+
}
35+
36+
// Add session listener
37+
process.xdebugProcess?.session?.addSessionListener(UngrabMouseDebugSessionListener(process))
38+
39+
// We don't need any further events
40+
process.removeDebugProcessListener(this)
41+
}
42+
43+
}
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
/*
2+
* Minecraft Dev for IntelliJ
3+
*
4+
* https://minecraftdev.org
5+
*
6+
* Copyright (c) 2017 minecraft-dev
7+
*
8+
* MIT License
9+
*/
10+
11+
package com.demonwav.mcdev.platform.mcp.debug
12+
13+
import com.intellij.debugger.engine.DebugProcessImpl
14+
import com.intellij.debugger.engine.evaluation.EvaluationContextImpl
15+
import com.intellij.debugger.jdi.VirtualMachineProxyImpl
16+
import com.intellij.xdebugger.XDebugSessionListener
17+
import com.sun.jdi.BooleanValue
18+
import com.sun.jdi.ClassType
19+
20+
class UngrabMouseDebugSessionListener(private val process: DebugProcessImpl) : XDebugSessionListener {
21+
22+
private fun grabMouse(grab: Boolean) {
23+
val suspendContextImpl = process.debuggerContext.suspendContext ?: return
24+
val frameProxy = suspendContextImpl.frameProxy ?: return
25+
val debugProcess = suspendContextImpl.debugProcess
26+
val virtualMachine = debugProcess.virtualMachineProxy as? VirtualMachineProxyImpl ?: return
27+
val evaluationContext = EvaluationContextImpl(suspendContextImpl, frameProxy)
28+
29+
val mouseClass = virtualMachine.classesByName("org.lwjgl.input.Mouse")?.singleOrNull() as? ClassType ?: return
30+
val isGrabbed = mouseClass.methodsByName("isGrabbed", "()Z")?.singleOrNull() ?: return
31+
val setGrabbed = mouseClass.methodsByName("setGrabbed", "(Z)V")?.singleOrNull() ?: return
32+
val grabValue = virtualMachine.mirrorOf(grab)
33+
34+
val currentState = debugProcess.invokeMethod(evaluationContext, mouseClass, isGrabbed, emptyList())
35+
if ((currentState as? BooleanValue)?.value() != grab) {
36+
debugProcess.invokeMethod(evaluationContext, mouseClass, setGrabbed, listOf(grabValue))
37+
}
38+
}
39+
40+
override fun sessionPaused() {
41+
grabMouse(false)
42+
}
43+
44+
}

src/main/kotlin/com/demonwav/mcdev/platform/mixin/debug/MixinRunConfigurationExtension.kt

Lines changed: 4 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -12,40 +12,16 @@ package com.demonwav.mcdev.platform.mixin.debug
1212

1313
import com.demonwav.mcdev.facet.MinecraftFacet
1414
import com.demonwav.mcdev.platform.mixin.MixinModuleType
15-
import com.intellij.execution.RunConfigurationExtension
16-
import com.intellij.execution.configurations.DebuggingRunnerData
17-
import com.intellij.execution.configurations.JavaParameters
18-
import com.intellij.execution.configurations.ModuleBasedConfiguration
19-
import com.intellij.execution.configurations.RunConfigurationBase
20-
import com.intellij.execution.configurations.RunnerSettings
15+
import com.demonwav.mcdev.util.ModuleDebugRunConfigurationExtension
2116
import com.intellij.execution.process.ProcessHandler
22-
import com.intellij.openapi.options.SettingsEditor
23-
import org.jdom.Element
17+
import com.intellij.openapi.module.Module
2418

25-
class MixinRunConfigurationExtension : RunConfigurationExtension() {
19+
class MixinRunConfigurationExtension : ModuleDebugRunConfigurationExtension() {
2620

27-
override fun isApplicableFor(configuration: RunConfigurationBase): Boolean {
28-
return configuration is ModuleBasedConfiguration<*>
29-
}
30-
31-
override fun <T : RunConfigurationBase?> updateJavaParameters(configuration: T, params: JavaParameters?, runnerSettings: RunnerSettings?) {}
32-
33-
override fun attachToProcess(configuration: RunConfigurationBase, handler: ProcessHandler, runnerSettings: RunnerSettings?) {
34-
// Check if we are in a debug run
35-
if (runnerSettings !is DebuggingRunnerData) {
36-
return
37-
}
38-
39-
val config = configuration as ModuleBasedConfiguration<*>
40-
val module = config.configurationModule.module ?: return
21+
override fun attachToProcess(handler: ProcessHandler, module: Module) {
4122
if (MinecraftFacet.getInstance(module)?.isOfType(MixinModuleType) == true) {
4223
// Add marker data to enable Mixin debugger
4324
handler.putUserData(MIXIN_DEBUG_KEY, true)
4425
}
4526
}
46-
47-
override fun readExternal(runConfiguration: RunConfigurationBase, element: Element) {}
48-
49-
override fun getEditorTitle(): String? = null
50-
override fun <P : RunConfigurationBase?> createEditor(configuration: P): SettingsEditor<P>? = null
5127
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
/*
2+
* Minecraft Dev for IntelliJ
3+
*
4+
* https://minecraftdev.org
5+
*
6+
* Copyright (c) 2017 minecraft-dev
7+
*
8+
* MIT License
9+
*/
10+
11+
package com.demonwav.mcdev.util
12+
13+
import com.intellij.execution.RunConfigurationExtension
14+
import com.intellij.execution.configurations.DebuggingRunnerData
15+
import com.intellij.execution.configurations.JavaParameters
16+
import com.intellij.execution.configurations.ModuleBasedConfiguration
17+
import com.intellij.execution.configurations.RunConfigurationBase
18+
import com.intellij.execution.configurations.RunnerSettings
19+
import com.intellij.execution.process.ProcessHandler
20+
import com.intellij.openapi.module.Module
21+
import com.intellij.openapi.options.SettingsEditor
22+
import org.jdom.Element
23+
24+
abstract class ModuleDebugRunConfigurationExtension : RunConfigurationExtension() {
25+
26+
override fun isApplicableFor(configuration: RunConfigurationBase): Boolean {
27+
return configuration is ModuleBasedConfiguration<*>
28+
}
29+
30+
override fun <T : RunConfigurationBase?> updateJavaParameters(configuration: T, params: JavaParameters?, runnerSettings: RunnerSettings?) {}
31+
32+
protected abstract fun attachToProcess(handler: ProcessHandler, module: Module)
33+
34+
override fun attachToProcess(configuration: RunConfigurationBase, handler: ProcessHandler, runnerSettings: RunnerSettings?) {
35+
// Check if we are in a debug run
36+
if (runnerSettings !is DebuggingRunnerData) {
37+
return
38+
}
39+
40+
val config = configuration as ModuleBasedConfiguration<*>
41+
val module = config.configurationModule.module ?: return
42+
attachToProcess(handler, module)
43+
}
44+
45+
override fun readExternal(runConfiguration: RunConfigurationBase, element: Element) {}
46+
47+
override fun getEditorTitle(): String? = null
48+
override fun <P : RunConfigurationBase?> createEditor(configuration: P): SettingsEditor<P>? = null
49+
50+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@
155155

156156
<library.presentationProvider implementation="com.demonwav.mcdev.platform.mcp.framework.McpPresentationProvider" />
157157

158+
<runConfigurationExtension implementation="com.demonwav.mcdev.platform.mcp.debug.McpRunConfigurationExtension"/>
159+
158160
<!-- access transformer file type -->
159161
<fileTypeFactory implementation="com.demonwav.mcdev.platform.mcp.at.AtFileTypeFactory"/>
160162
<lang.parserDefinition language="Access Transformers" implementationClass="com.demonwav.mcdev.platform.mcp.at.AtParserDefinition"/>

0 commit comments

Comments
 (0)