najoan125 / fabric-koreanchat

GNU Lesser General Public License v3.0
2 stars 1 forks source link

바닐라 스크린 외의 텍스트 필드에서 한영 변환 되지 않음 #18

Closed Shihyeon closed 2 months ago

Shihyeon commented 2 months ago

한영 변환을 스크린에서 하는 로직으로 보이는데, 이로 인해 바닐라가 아닌 텍스트 필드에서 한영 변환이 이루어지지 않습니다.

(Journeymap create waypoint screen의 텍스트 필드에서 작동하지 않음)

아래와 같이 텍스트 필드 믹스인에 한영 변환을 넣으면 작동하긴 하나, 스크린 키 인풋 믹스인과 중복으로 적용되어 바닐라 스크린에는 한영 변환이 이루어지지 않습니다.

@Mixin(value = {TextFieldWidget.class})
public abstract class TextFieldWidgetMixin implements ITextFieldWidgetAccessor {

    ...

    @Inject(at = {@At(value = "HEAD")}, method = {"keyPressed(III)Z"}, cancellable = true)
    private void keyPressed(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> callbackInfo) {
        MinecraftClient client = MinecraftClient.getInstance();
        if (client.currentScreen != null &&
                !(client.currentScreen instanceof JigsawBlockScreen) &&
                !(client.currentScreen instanceof StructureBlockScreen) &&
                !(client.currentScreen instanceof CreateWorldScreen && !KoreanPatchClient.gameTab)) {
            if (keyCode == GLFW.GLFW_KEY_BACKSPACE) {
                if (handler.onBackspaceKeyPressed()) {
                    callbackInfo.setReturnValue(Boolean.TRUE);
                }
            }
            // 이 부분 추가
            if (KoreanPatchClient.imeBinding.matchesKey(keyCode, scanCode) && modifiers == 2) {
                KoreanPatchClient.getController().toggleFocus();
            } else if (KoreanPatchClient.langBinding.matchesKey(keyCode, scanCode) && !KoreanPatchClient.IME) {
                LanguageUtil.toggleCurrentType();
            }
        }
    }
}
najoan125 commented 2 months ago

여러 Screen에서 한영 변환을 지원하기 위해 Screen Mixin을 만들어 적용했으나, 지원하지 않는 부분들이 있는 것 같습니다. 하지만 위와 같이 적용할 경우, ScreenMixin에 있는 것과 동시에 작동할 수 있어서 기존에 있던 코드를 제거한 것입니다... 이번 1.5.2 릴리즈는 급한 버그만 수정한 거고요, 근본적인 해결을 위해서는 좀 더 시간이 필요할 것 같아요. TextFIeldWidget Mixin에만 적용하면 ModMenu의 TextFIeldWidget?에는 적용이 되지 않더라구요

Shihyeon commented 2 months ago

TextFieldWidgetMixin에 위와 같이 추가하고, ScreenKeyInputMixin을 아래와 같이 할 경우,

@Mixin(Screen.class)
public class ScreenKeyInputMixin {
    @Inject(method = "keyPressed", at = @At("HEAD"))
    private void onInput(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) {
//        ModLogger.debug(keyCode + " " + scanCode + " " + modifiers);
//        if (KoreanPatchClient.imeBinding.matchesKey(keyCode, scanCode) && modifiers == 2) {
//            KoreanPatchClient.getController().toggleFocus();
//        } else if (KoreanPatchClient.langBinding.matchesKey(keyCode, scanCode) && !KoreanPatchClient.IME) {
//            LanguageUtil.toggleCurrentType();
//        }
    }
}

추가: 이 방법으로 할 경우 모드메뉴가 적용이 안 되네요... 더 연구가 필요해 보이네요...

Shihyeon commented 2 months ago

ModMenu의 searchBox를 Mixin하는 방법은 어떤가요? 위와 같이 텍스트 필드에 토글 랭 키를 설정하고, 모드메뉴는 따로 믹스인하였습니다.

이렇게 작동하긴 합니다.

https://github.com/TerraformersMC/ModMenu/blob/1.21/src/main/java/com/terraformersmc/modmenu/gui/ModsScreen.java#L309

repositories {
    maven {
        name = 'Terraformers'
        url = 'https://maven.terraformersmc.com/'
    }
}
dependencies {
    modCompileOnly("com.terraformersmc:modmenu:11.0.1") {
        exclude group: 'net.fabricmc.fabric-api'
    }
}
package com.hyfata.najoan.koreanpatch.mixin;

@Mixin(ModsScreen.class)
public class ModMenuScreenMixin {

    @Inject(method = {"keyPressed"}, at = @At(value = "HEAD"))
    private void keyPress(int keyCode, int scanCode, int modifiers, CallbackInfoReturnable<Boolean> cir) {
        ModLogger.debug(keyCode + " " + scanCode + " " + modifiers);
        if (KoreanPatchClient.imeBinding.matchesKey(keyCode, scanCode) && modifiers == 2) {
            KoreanPatchClient.getController().toggleFocus();
        } else if (KoreanPatchClient.langBinding.matchesKey(keyCode, scanCode) && !KoreanPatchClient.IME) {
            LanguageUtil.toggleCurrentType();
        }
    }
}
{
  "required": true,
  "minVersion": "0.8",
  "package": "com.hyfata.najoan.koreanpatch.mixin",
  "compatibilityLevel": "JAVA_21",
  "mixins": [
  ],
  "client": [
    "ModMenuScreenMixin",
    ...
  ],
  "injectors": {
    "defaultRequire": 1
  }
}