diff --git a/.gitignore b/.gitignore index 01367bc..8b7f4e2 100644 --- a/.gitignore +++ b/.gitignore @@ -1,28 +1,9 @@ -/* - .DS_Store *.dylib *.so *.dll *.o - -!.gitignore -!.github -!src -!libcocoainput -!README.MD -!build_lib_for_mac.sh -!build_lib_for_win.sh -!build_lib_for_x11.sh -!build_lib_all.sh -!build_cocoainput_all_platform.sh -!TODO.txt -!LICENSE - libcocoainput/build -!fabric -!forge -!1.12.2 -!1.18.2 +.gradle diff --git a/1.18.2/build.gradle b/1.18.2/build.gradle new file mode 100644 index 0000000..4e8623c --- /dev/null +++ b/1.18.2/build.gradle @@ -0,0 +1,14 @@ +// 全サブプロジェクト共通の設定 +subprojects { + apply plugin: 'java' + + java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + } + + tasks.withType(JavaCompile) { + options.encoding = 'UTF-8' + } +} \ No newline at end of file diff --git a/1.18.2/core/.gitignore b/1.18.2/core/.gitignore new file mode 100644 index 0000000..378eac2 --- /dev/null +++ b/1.18.2/core/.gitignore @@ -0,0 +1 @@ +build diff --git a/1.18.2/core/build.gradle b/1.18.2/core/build.gradle new file mode 100644 index 0000000..58c1139 --- /dev/null +++ b/1.18.2/core/build.gradle @@ -0,0 +1,33 @@ +plugins { + id 'java' +} + +group = 'com.example.yourmod' +version = '1.0.0' + +repositories { + mavenCentral() +} + +dependencies { + // coreで必要な依存関係のみ + compileOnly 'net.java.dev.jna:jna:5.13.0' + compileOnly 'net.java.dev.jna:jna-platform:5.13.0' + compileOnly 'commons-io:commons-io:2.11.0' + compileOnly 'org.apache.logging.log4j:log4j-core:2.25.3' + // TODO(kisaragi): 妥協しているがバージョンが違うと容易にスライドするのでMinecraft側ソースに責務を押し付けるべき + compileOnly 'org.lwjgl:lwjgl-glfw:3.2.3' +} + +java { + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task + // if it is present. + // If you remove this line, sources will not be generated. + + sourceSets.main.java.srcDirs=['src/main/java'] + sourceSets.main.resources.srcDirs=['src/main/resources'] + withSourcesJar() +} diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/CocoaInput.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/CocoaInput.java new file mode 100644 index 0000000..48e2fc4 --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/CocoaInput.java @@ -0,0 +1,64 @@ +package jp.axer.cocoainput; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import com.sun.jna.Platform; + +import jp.axer.cocoainput.arch.darwin.DarwinController; +import jp.axer.cocoainput.arch.dummy.DummyController; +import jp.axer.cocoainput.arch.win.WinController; +import jp.axer.cocoainput.arch.x11.X11Controller; +import jp.axer.cocoainput.plugin.CocoaInputController; +import jp.axer.cocoainput.domain.*; + +public class CocoaInput { + private static CocoaInputController controller; + // TODO(kisargi): あとで直す + // public static ConfigPack config = ConfigPack.defaultConfig; + private static SimpleLogger logger; + + public CocoaInput(String loader, SimpleLogger logger, MinecraftRawWindowIdAccessor w, NativeLibraryLoader n, ScreenScaleFactorGetter s) { + logger.log("Modloader:" + loader); + try { + if (Platform.isMac()) { + CocoaInput.applyController(new DarwinController(n, logger, s)); + } else if (Platform.isWindows()) { + CocoaInput.applyController(new WinController(w, n, s)); + } else if (Platform.isX11()) { + CocoaInput.applyController(new X11Controller(w, n)); + } else { + logger.log("CocoaInput cannot find appropriate Controller in running OS."); + CocoaInput.applyController(new DummyController(logger)); + } + logger.log("CocoaInput has been initialized."); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static double getScreenScaledFactor(ScreenScaleFactorGetter getter) { + return getter.getFactor(); + // return Minecraft.getInstance().getWindow().getGuiScale(); + } + + public static void applyController(CocoaInputController controller) throws IOException { + CocoaInput.controller = controller; + logger.log("CocoaInput is now using controller:" + controller.getClass().toString()); + } + + public static CocoaInputController getController() { + return CocoaInput.controller; + } + + public void distributeScreen(WrapperChecker sc) { + if (CocoaInput.getController() != null) { + CocoaInput.getController().screenOpenNotify(sc); + } + } +} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/CallbackFunction.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/CallbackFunction.java similarity index 91% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/CallbackFunction.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/CallbackFunction.java index c93bcde..3d5b5db 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/CallbackFunction.java +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/CallbackFunction.java @@ -2,7 +2,7 @@ import com.sun.jna.Callback; import com.sun.jna.Pointer; -import jp.axer.cocoainput.util.ModLogger; +import jp.axer.cocoainput.domain.SimpleLogger; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; @@ -33,7 +33,8 @@ public void invoke(String msg) { }; public static Callback Func_debug = new Callback() { public void invoke(String msg) { - if (ModLogger.debugMode) { + // TODO(kisaragi): make switchable? + if (true) { LogManager.getLogger("CocoaInput:ObjC").log(Level.DEBUG, msg); } } diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinController.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinController.java new file mode 100644 index 0000000..ef812b4 --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinController.java @@ -0,0 +1,45 @@ +package jp.axer.cocoainput.arch.darwin; + +import java.lang.reflect.Field; + +import jp.axer.cocoainput.CocoaInput; +import jp.axer.cocoainput.domain.*; +import jp.axer.cocoainput.plugin.CocoaInputController; +import jp.axer.cocoainput.plugin.IMEOperator; +import jp.axer.cocoainput.plugin.IMEReceiver; + +public class DarwinController implements CocoaInputController { + private SimpleLogger logger; + private ScreenScaleFactorGetter factorGetter; + + public DarwinController(NativeLibraryLoader nativeLibraryLoader, SimpleLogger logger, ScreenScaleFactorGetter getter) throws Exception { + this.logger = logger; + this.factorGetter = getter; + nativeLibraryLoader.copyFrom("libcocoainput.dylib", "darwin/libcocoainput.dylib"); + Handle.INSTANCE.initialize(CallbackFunction.Func_log, CallbackFunction.Func_error, CallbackFunction.Func_debug); + logger.log("DarwinController has been initialized."); + } + + @Override + public IMEOperator generateIMEOperator(IMEReceiver ime) { + return new DarwinIMEOperator(ime, logger, factorGetter); + } + + + @Override + public void screenOpenNotify(WrapperChecker checker) { + if (checker.isAlreadyInitialized()) { + return; + } + /* + try { + Field wrapper = gui.getClass().getField("wrapper"); + wrapper.setAccessible(true); + if (wrapper.get(gui) instanceof IMEReceiver) + return; + } catch (Exception e) { + /* relax */ //} + Handle.INSTANCE.refreshInstance();//GUIの切り替えでIMの使用をoffにする + + } +} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinIMEOperator.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinIMEOperator.java similarity index 79% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinIMEOperator.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinIMEOperator.java index 3ac1713..dc29f57 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinIMEOperator.java +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinIMEOperator.java @@ -8,8 +8,7 @@ import jp.axer.cocoainput.arch.darwin.CallbackFunction.Func_setMarkedText; import jp.axer.cocoainput.plugin.IMEOperator; import jp.axer.cocoainput.plugin.IMEReceiver; -import jp.axer.cocoainput.util.ModLogger; -import jp.axer.cocoainput.util.Rect; +import jp.axer.cocoainput.domain.*; import java.util.UUID; @@ -19,15 +18,19 @@ public class DarwinIMEOperator implements IMEOperator { Func_insertText insertText_p; Func_setMarkedText setMarkedText_p; Func_firstRectForCharacterRange firstRectForCharacterRange_p; + SimpleLogger logger; + ScreenScaleFactorGetter scaler; boolean isFocused = false; - public DarwinIMEOperator(IMEReceiver field) { + public DarwinIMEOperator(IMEReceiver field, SimpleLogger logger, ScreenScaleFactorGetter scaler) { this.owner = field; + this.logger = logger; + this.scaler = scaler; uuid = UUID.randomUUID().toString(); insertText_p = new Func_insertText() { @Override public void invoke(String str, int position, int length) { - ModLogger.debug("Textfield " + uuid + " received inserted text."); + logger.debug("Textfield " + uuid + " received inserted text."); owner.insertText(str, position, length); } }; @@ -35,7 +38,7 @@ public void invoke(String str, int position, int length) { @Override public void invoke(String str, int position1, int length1, int position2, int length2) { - ModLogger.debug("MarkedText changed at " + uuid + "."); + logger.debug("MarkedText changed at " + uuid + "."); owner.setMarkedText(str, position1, length1, position2, length2); ; } @@ -45,7 +48,7 @@ public void invoke(String str, int position1, int length1, @Override public Pointer invoke() { - ModLogger.debug("Called to determine where to draw."); + logger.debug("Called to determine where to draw."); Rect point = owner.getRect(); float[] buff; if (point == null) { @@ -53,7 +56,7 @@ public Pointer invoke() { } else { buff = new float[]{point.getX(), point.getY(), point.getWidth(), point.getHeight()}; } - double factor = CocoaInput.getScreenScaledFactor(); + double factor = scaler.getFactor(); buff[0] *= factor; buff[1] *= factor; buff[2] *= factor; @@ -65,7 +68,7 @@ public Pointer invoke() { } }; - ModLogger.log("IMEOperator addInstance: " + uuid); + logger.log("IMEOperator addInstance: " + uuid); Handle.INSTANCE.addInstance(uuid, insertText_p, setMarkedText_p, firstRectForCharacterRange_p); } @@ -79,7 +82,7 @@ public void removeInstance() { public void setFocused(boolean yn) { if (yn != isFocused) { - ModLogger.log("IMEOperator.setFocused: " + (yn ? "true" : "false")); + logger.log("IMEOperator.setFocused: " + (yn ? "true" : "false")); Handle.INSTANCE.setIfReceiveEvent(uuid, yn ? 1 : 0); isFocused = yn; } diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/Handle.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/Handle.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/Handle.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/darwin/Handle.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/dummy/DummyController.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/dummy/DummyController.java similarity index 67% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/dummy/DummyController.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/dummy/DummyController.java index d1edbfa..e89bc48 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/arch/dummy/DummyController.java +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/dummy/DummyController.java @@ -3,12 +3,11 @@ import jp.axer.cocoainput.plugin.CocoaInputController; import jp.axer.cocoainput.plugin.IMEOperator; import jp.axer.cocoainput.plugin.IMEReceiver; -import jp.axer.cocoainput.util.ModLogger; -import net.minecraft.client.gui.screens.Screen; +import jp.axer.cocoainput.domain.*; public class DummyController implements CocoaInputController{ - public DummyController() { - ModLogger.log("This is a dummy controller."); + public DummyController(SimpleLogger logger) { + logger.log("This is a dummy controller."); } @Override @@ -17,7 +16,7 @@ public IMEOperator generateIMEOperator(IMEReceiver ime) { } @Override - public void screenOpenNotify(Screen sc) { + public void screenOpenNotify(WrapperChecker sc) { // TODO 自動生成されたメソッド・スタブ } diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/dummy/DummyIMEOperator.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/dummy/DummyIMEOperator.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/dummy/DummyIMEOperator.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/dummy/DummyIMEOperator.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/win/Handle.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/win/Handle.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/win/Handle.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/win/Handle.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/win/Logger.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/win/Logger.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/win/Logger.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/win/Logger.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/win/WinController.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/win/WinController.java similarity index 77% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/win/WinController.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/win/WinController.java index 58e9c04..11bdaa2 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/arch/win/WinController.java +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/win/WinController.java @@ -9,12 +9,10 @@ import jp.axer.cocoainput.arch.win.Handle.DoneCallback; import jp.axer.cocoainput.arch.win.Handle.PreeditCallback; import jp.axer.cocoainput.arch.win.Handle.RectCallback; +import jp.axer.cocoainput.domain.*; import jp.axer.cocoainput.plugin.CocoaInputController; import jp.axer.cocoainput.plugin.IMEOperator; import jp.axer.cocoainput.plugin.IMEReceiver; -import jp.axer.cocoainput.util.Rect; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; public class WinController implements CocoaInputController { @@ -51,7 +49,7 @@ public int invoke(Pointer ret) { } else { buff = new float[]{point.getX(), point.getY(), point.getWidth(), point.getHeight()}; } - double factor = CocoaInput.getScreenScaledFactor(); + double factor = scaler.getFactor(); buff[0] *= factor; buff[1] *= factor; buff[2] *= factor; @@ -65,14 +63,17 @@ public int invoke(Pointer ret) { }; - public WinController() { + ScreenScaleFactorGetter scaler; + + public WinController(MinecraftRawWindowIdAccessor rawWindowIdAccessor, NativeLibraryLoader loader, ScreenScaleFactorGetter s) { + this.scaler = s; Logger.log("This is Windows Controller"); try { - CocoaInput.copyLibrary("libwincocoainput.dll", "win/libwincocoainput.dll"); + loader.copyFrom("libwincocoainput.dll", "win/libwincocoainput.dll"); } catch (IOException e) { e.printStackTrace(); } - Handle.INSTANCE.initialize(org.lwjgl.glfw.GLFWNativeWin32.glfwGetWin32Window(Minecraft.getInstance().getWindow().getWindow()), pc, dc,rc, Logger.clangLog, Logger.clangError, Logger.clangDebug); + Handle.INSTANCE.initialize(org.lwjgl.glfw.GLFWNativeWin32.glfwGetWin32Window(rawWindowIdAccessor.getRawId()), pc, dc,rc, Logger.clangLog, Logger.clangError, Logger.clangDebug); } @@ -82,14 +83,18 @@ public IMEOperator generateIMEOperator(IMEReceiver arg0) { return new WinIMEOperator(arg0); } @Override - public void screenOpenNotify(Screen gui) { + public void screenOpenNotify(WrapperChecker checker) { + if (checker.isAlreadyInitialized()) { + return; + } + /* try { Field wrapper = gui.getClass().getField("wrapper"); wrapper.setAccessible(true); if (wrapper.get(gui) instanceof IMEReceiver) return; } catch (Exception e) { - /* relax */} + /* relax */ //} if (WinController.focusedOperator != null) { //WinIMEOperator old=WinController.focusedOperator; //WinController.focusedOperator=null; diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/win/WinIMEOperator.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/win/WinIMEOperator.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/win/WinIMEOperator.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/win/WinIMEOperator.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/x11/Handle.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/x11/Handle.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/x11/Handle.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/x11/Handle.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/x11/Logger.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/x11/Logger.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/x11/Logger.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/x11/Logger.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/x11/X11Controller.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/x11/X11Controller.java similarity index 85% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/x11/X11Controller.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/x11/X11Controller.java index ec7128a..246601b 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/arch/x11/X11Controller.java +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/x11/X11Controller.java @@ -11,11 +11,10 @@ import com.sun.jna.WString; import jp.axer.cocoainput.CocoaInput; +import jp.axer.cocoainput.domain.*; import jp.axer.cocoainput.plugin.CocoaInputController; import jp.axer.cocoainput.plugin.IMEOperator; import jp.axer.cocoainput.plugin.IMEReceiver; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; public class X11Controller implements CocoaInputController { @@ -52,6 +51,8 @@ public void invoke() { }; public static void setupKeyboardEvent() { + // TODO(kisaragi): あとで直す + /* Minecraft.getInstance().keyboardHandler.setup(window); GLFW.glfwSetCharModsCallback(window, (p_228000_1_, p_228000_3_, p_228000_4_) -> { Minecraft.getInstance().execute(() -> { @@ -65,16 +66,17 @@ public static void setupKeyboardEvent() { } }); }); + */ } - private static final long window = Minecraft.getInstance().getWindow().getWindow(); - - public X11Controller() throws IOException { + private final long window; + public X11Controller(MinecraftRawWindowIdAccessor accessor, NativeLibraryLoader loader) throws IOException { setupKeyboardEvent(); + window = accessor.getRawId(); Logger.log("This is X11 Controller"); - CocoaInput.copyLibrary("libx11cocoainput.so", "x11/libx11cocoainput.so"); + loader.copyFrom("libx11cocoainput.so", "x11/libx11cocoainput.so"); Logger.log("Call clang initializer"); Handle.INSTANCE.initialize(window, GLFWNativeX11.glfwGetX11Window(window), this.c_draw, this.c_done, Logger.clangLog, Logger.clangError, Logger.clangDebug); @@ -91,14 +93,18 @@ public IMEOperator generateIMEOperator(IMEReceiver arg0) { } @Override - public void screenOpenNotify(Screen gui) { + public void screenOpenNotify(WrapperChecker checker) { + if (checker.isAlreadyInitialized()) { + return; + } + /* try { Field wrapper = gui.getClass().getField("wrapper"); wrapper.setAccessible(true); if (wrapper.get(gui) instanceof IMEReceiver) return; } catch (Exception e) { - /* relax */} + /* relax */ //} if (X11Controller.focusedOperator != null) { X11Controller.focusedOperator.setFocused(false); X11Controller.focusedOperator = null; diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/x11/X11IMEOperator.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/arch/x11/X11IMEOperator.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/arch/x11/X11IMEOperator.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/arch/x11/X11IMEOperator.java diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/config/ConfigPack.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/config/ConfigPack.java new file mode 100644 index 0000000..5a4f943 --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/config/ConfigPack.java @@ -0,0 +1,6 @@ +package jp.axer.cocoainput.config; + +public interface ConfigPack { + boolean isAdvancedPreeditDraw(); + boolean isNativeCharTyped(); +} diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/LibraryCopyImpl.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/LibraryCopyImpl.java new file mode 100644 index 0000000..16e0048 --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/LibraryCopyImpl.java @@ -0,0 +1,56 @@ +package jp.axer.cocoainput.domain; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + +import jp.axer.cocoainput.CocoaInput; +import org.apache.commons.io.IOUtils; + +import jp.axer.cocoainput.domain.*; + +public class LibraryCopyImpl implements NativeLibraryLoader { + private SimpleLogger logger; + private String zipsource; + private final MinecraftNativeFolderAccessor minecraftNativeFolderAccessor; + + public LibraryCopyImpl(SimpleLogger logger, String zipsource, MinecraftNativeFolderAccessor minecraftNativeFolderAccessor) { + this.logger = logger; + this.zipsource = zipsource; + this.minecraftNativeFolderAccessor = minecraftNativeFolderAccessor; + } + + public void copyFrom(String libraryName, String libraryPath) throws IOException { + InputStream libFile; + if (zipsource == null) {//Fabric case + libFile = CocoaInput.class.getResourceAsStream("/" + libraryPath); + } else { + try {//Modファイルを検出し、jar内からライブラリを取り出す + ZipFile jarfile = new ZipFile(zipsource); + libFile = jarfile.getInputStream(new ZipEntry(libraryPath)); + } catch (FileNotFoundException e) {//存在しない場合はデバッグモードであるのでクラスパスからライブラリを取り出す + logger.log("Couldn't get library path. Is this debug mode?'"); + libFile = ClassLoader.getSystemResourceAsStream(libraryPath); + } + } + File nativeDir = new File(minecraftNativeFolderAccessor.getRoot().concat("/native")); + File copyLibFile = new File( + minecraftNativeFolderAccessor.getRoot().concat("/native/" + libraryName)); + try { + nativeDir.mkdir(); + FileOutputStream fos = new FileOutputStream(copyLibFile); + copyLibFile.createNewFile(); + IOUtils.copy(libFile, fos); + fos.close(); + } catch (IOException e1) { + logger.error("Attempted to copy library to ./native/" + libraryName + " but failed."); + throw e1; + } + System.setProperty("jna.library.path", nativeDir.getAbsolutePath()); + logger.log("CocoaInput has copied library to native directory."); + } +} \ No newline at end of file diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/MinecraftNativeFolderAccessor.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/MinecraftNativeFolderAccessor.java new file mode 100644 index 0000000..8d2614d --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/MinecraftNativeFolderAccessor.java @@ -0,0 +1,5 @@ +package jp.axer.cocoainput.domain; + +public interface MinecraftNativeFolderAccessor { + String getRoot(); +} diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/MinecraftRawWindowIdAccessor.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/MinecraftRawWindowIdAccessor.java new file mode 100644 index 0000000..9c685de --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/MinecraftRawWindowIdAccessor.java @@ -0,0 +1,5 @@ +package jp.axer.cocoainput.domain; + +public interface MinecraftRawWindowIdAccessor { + public long getRawId(); +} diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/NativeLibraryLoader.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/NativeLibraryLoader.java new file mode 100644 index 0000000..fb04544 --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/NativeLibraryLoader.java @@ -0,0 +1,5 @@ +package jp.axer.cocoainput.domain; + +public interface NativeLibraryLoader { + public void copyFrom(String a, String b) throws java.io.IOException; +} \ No newline at end of file diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/NativeTextInserter.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/NativeTextInserter.java new file mode 100644 index 0000000..082eba7 --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/NativeTextInserter.java @@ -0,0 +1,5 @@ +package jp.axer.cocoainput.domain; + +public interface NativeTextInserter { + public void enqueueMany(String input); +} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/util/PreeditFormatter.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/PreeditFormatter.java similarity index 86% rename from 1.18.2/src/main/java/jp/axer/cocoainput/util/PreeditFormatter.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/domain/PreeditFormatter.java index 1eafa75..fa0c24d 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/util/PreeditFormatter.java +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/PreeditFormatter.java @@ -1,6 +1,7 @@ -package jp.axer.cocoainput.util; +package jp.axer.cocoainput.domain; public class PreeditFormatter { + // TODO(kisaragi): remove this constant public static final char SECTION = 167; // avoid shift-jis bug... public static Tuple3 formatMarkedText(String aString, int position1, int length1) {//ユーティリティ @@ -14,6 +15,6 @@ public static Tuple3 formatMarkedText(String aString, } builder.insert(0, SECTION+"r"+SECTION+"n");//最初に下線修飾をセット builder.append(SECTION+"r");//最後に修飾をリセット - return new Tuple3(new String(builder), position1, hasCaret); + return new Tuple3<>(new String(builder), position1, hasCaret); } } diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/util/Rect.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/Rect.java similarity index 93% rename from 1.18.2/src/main/java/jp/axer/cocoainput/util/Rect.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/domain/Rect.java index d5125a3..4cd2c3d 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/util/Rect.java +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/Rect.java @@ -1,4 +1,4 @@ -package jp.axer.cocoainput.util; +package jp.axer.cocoainput.domain; public class Rect { private float x; diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/ScreenScaleFactorGetter.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/ScreenScaleFactorGetter.java new file mode 100644 index 0000000..333ead8 --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/ScreenScaleFactorGetter.java @@ -0,0 +1,5 @@ +package jp.axer.cocoainput.domain; + +public interface ScreenScaleFactorGetter { + public double getFactor(); +} diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/SimpleLogger.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/SimpleLogger.java new file mode 100644 index 0000000..045f9ac --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/SimpleLogger.java @@ -0,0 +1,9 @@ +package jp.axer.cocoainput.domain; + +public interface SimpleLogger { + public void log(String msg,Object...data); + + public void error(String msg,Object...data); + + public void debug(String msg,Object...data); +} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/util/Tuple3.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/Tuple3.java similarity index 88% rename from 1.18.2/src/main/java/jp/axer/cocoainput/util/Tuple3.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/domain/Tuple3.java index 02f6d41..e1d85dc 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/util/Tuple3.java +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/Tuple3.java @@ -1,4 +1,4 @@ -package jp.axer.cocoainput.util; +package jp.axer.cocoainput.domain; public class Tuple3 { A va; diff --git a/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/WrapperChecker.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/WrapperChecker.java new file mode 100644 index 0000000..b8f0508 --- /dev/null +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/domain/WrapperChecker.java @@ -0,0 +1,5 @@ +package jp.axer.cocoainput.domain; + +public interface WrapperChecker { + public boolean isAlreadyInitialized(); +} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/plugin/CocoaInputController.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/plugin/CocoaInputController.java similarity index 70% rename from 1.18.2/src/main/java/jp/axer/cocoainput/plugin/CocoaInputController.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/plugin/CocoaInputController.java index ffe1a7b..bb3e836 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/plugin/CocoaInputController.java +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/plugin/CocoaInputController.java @@ -1,8 +1,9 @@ package jp.axer.cocoainput.plugin; -import net.minecraft.client.gui.screens.Screen; +import jp.axer.cocoainput.domain.WrapperChecker; public interface CocoaInputController { IMEOperator generateIMEOperator(IMEReceiver ime); //GuiTextFieldとかが作成された時に割り当てるIMEOperator生成処理を委託 - void screenOpenNotify(Screen sc); + void screenOpenNotify(WrapperChecker w); } + diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/plugin/IMEOperator.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/plugin/IMEOperator.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/plugin/IMEOperator.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/plugin/IMEOperator.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/plugin/IMEReceiver.java b/1.18.2/core/src/main/java/jp/axer/cocoainput/plugin/IMEReceiver.java similarity index 89% rename from 1.18.2/src/main/java/jp/axer/cocoainput/plugin/IMEReceiver.java rename to 1.18.2/core/src/main/java/jp/axer/cocoainput/plugin/IMEReceiver.java index b43df23..87f22a5 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/plugin/IMEReceiver.java +++ b/1.18.2/core/src/main/java/jp/axer/cocoainput/plugin/IMEReceiver.java @@ -2,10 +2,7 @@ import jp.axer.cocoainput.CocoaInput; import jp.axer.cocoainput.arch.win.Logger; -import jp.axer.cocoainput.util.PreeditFormatter; -import jp.axer.cocoainput.util.Rect; -import jp.axer.cocoainput.util.Tuple3; -import net.minecraft.client.Minecraft; +import jp.axer.cocoainput.domain.*; public abstract class IMEReceiver { @@ -32,11 +29,14 @@ public void insertText(String aString, int position1, int length1) {//確定文 length = 0; this.setCursorPos(originalCursorPosition); this.setSelectionPos(originalCursorPosition); + // TODO(kisaragi): 後で考える + /* if (CocoaInput.config.isNativeCharTyped()) { this.insertTextNative(aString); } else { + */ this.insertTextEmurated(aString); - } + // } /* if (aString.length() == 0) { this.setText((new StringBuffer(this.getText())) @@ -65,7 +65,8 @@ public void setMarkedText(String aString, int position1, int length1, int positi int caretPosition; boolean hasCaret; String commitString; - if (CocoaInput.config.isAdvancedPreeditDraw()) { + // TODO(kisaragi): config + if (true) { Tuple3 formattedText = PreeditFormatter.formatMarkedText(aString, position1, length1); commitString = formattedText._1(); @@ -108,11 +109,8 @@ public void setMarkedText(String aString, int position1, int length1, int positi abstract protected void setSelectionPos(int p); - protected void insertTextNative(String text) { - for (char c : text.toCharArray()) { - Minecraft instance = Minecraft.getInstance(); - instance.keyboardHandler.charTyped(instance.getWindow().getWindow(), c, 0); - } + protected void insertTextNative(String text, NativeTextInserter nativeTextInserter) { + nativeTextInserter.enqueueMany(text); } protected void insertTextEmurated(String aString) { diff --git a/1.18.2/fabric/.gitignore b/1.18.2/fabric/.gitignore index a7de7e1..378eac2 100644 --- a/1.18.2/fabric/.gitignore +++ b/1.18.2/fabric/.gitignore @@ -1,18 +1 @@ -/* - -.DS_Store -*.dylib -*.so -*.dll -*.o - - -!.gitignore -!gradle -!gradle.properties -!gradlew -!gradlew.bat -!wslgradlew -!preprocess.sh -!build.gradle -!settings.gradle +build diff --git a/1.18.2/fabric/build.gradle b/1.18.2/fabric/build.gradle index 57c7b62..c48cf91 100644 --- a/1.18.2/fabric/build.gradle +++ b/1.18.2/fabric/build.gradle @@ -11,7 +11,7 @@ version = project.mod_version group = project.maven_group loom { - accessWidenerPath = file("../src/fabric/resources/cocoainput.accesswidener") + accessWidenerPath = file("src/fabric/resources/cocoainput.accesswidener") } repositories { @@ -33,6 +33,7 @@ dependencies { modImplementation "com.terraformersmc:modmenu:${project.modmenu_version}" // PSA: Some older mods, compiled on Loom 0.2.1, might have outdated Maven POMs. // You may need to force-disable transitiveness on them. + implementation project(':core') } processResources { @@ -61,11 +62,9 @@ java { // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task // if it is present. // If you remove this line, sources will not be generated. - sourceSets.main.java.srcDirs+=['../src/main'] - sourceSets.main.java.srcDirs+=['../src/fabric'] - sourceSets.main.resources.srcDirs+=['../src/main/resources'] - sourceSets.main.resources.srcDirs+=['../src/fabric/resources'] + sourceSets.main.java.srcDirs+=['src/fabric/java'] + sourceSets.main.resources.srcDirs+=['src/fabric/resources'] withSourcesJar() } diff --git a/1.18.2/fabric/settings.gradle b/1.18.2/fabric/settings.gradle deleted file mode 100644 index f91a4fe..0000000 --- a/1.18.2/fabric/settings.gradle +++ /dev/null @@ -1,9 +0,0 @@ -pluginManagement { - repositories { - maven { - name = 'Fabric' - url = 'https://maven.fabricmc.net/' - } - gradlePluginPortal() - } -} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/util/TinyConfig.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/config/fabric/FabricConfigImpl.java similarity index 59% rename from 1.18.2/src/main/java/jp/axer/cocoainput/util/TinyConfig.java rename to 1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/config/fabric/FabricConfigImpl.java index d842b3d..7395dd7 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/util/TinyConfig.java +++ b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/config/fabric/FabricConfigImpl.java @@ -1,4 +1,4 @@ -package jp.axer.cocoainput.util; +package jp.axer.cocoainput.config.fabric; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -20,7 +20,6 @@ import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import com.mojang.blaze3d.vertex.PoseStack; import net.minecraft.client.gui.screens.Screen; import net.minecraft.client.gui.components.EditBox; @@ -29,12 +28,12 @@ import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; -public class TinyConfig { +public class FabricConfigImpl { private static final Pattern INTEGER_ONLY = Pattern.compile("(-?[0-9]*)"); private static final Pattern DECIMAL_ONLY = Pattern.compile("-?([\\d]+\\.?[\\d]*|[\\d]*\\.?[\\d]+|\\.)"); - private static final List entries = new ArrayList<>(); + final List entries = new ArrayList<>(); protected static class EntryInfo { Field field; @@ -49,9 +48,9 @@ protected static class EntryInfo { boolean inLimits = true; } - private static Class configClass; - private static String translationPrefix; - private static Path path; + private final Class configClass; + private final String translationPrefix; + private final Path path; private static final Gson gson = new GsonBuilder() .excludeFieldsWithModifiers(Modifier.TRANSIENT) @@ -59,10 +58,10 @@ protected static class EntryInfo { .setPrettyPrinting() .create(); - public static void init(String modid,Path apath, Class config) { + public FabricConfigImpl(String modid, Path apath, Class config) { translationPrefix = modid + ".tinyconfig."; configClass = config; - path=apath; + path = apath; for (Field field : config.getFields()) { Entry e; @@ -121,7 +120,7 @@ else if (type.isEnum()) { } - private static void textField(EntryInfo info, Function f, Pattern pattern, double min, double max, boolean cast) { + private void textField(EntryInfo info, Function f, Pattern pattern, double min, double max, boolean cast) { boolean isNumber = pattern != null; info.widget = (BiFunction>) (t, b) -> s -> { s = s.trim(); @@ -153,10 +152,10 @@ private static void textField(EntryInfo info, Function f, Pattern }; } - public static void write() { + public void write() { try { if (!Files.exists(path)) Files.createFile(path); - Files.write(path, gson.toJson(configClass.newInstance()).getBytes()); + Files.write(path, gson.toJson(this).getBytes()); } catch (Exception e) { e.printStackTrace(); } @@ -164,88 +163,7 @@ public static void write() { } public Screen getScreen(Screen parent) { - return new TinyConfigScreen(parent); - } - - private static class TinyConfigScreen extends Screen { - protected TinyConfigScreen(Screen parent) { - super(new TextComponent("CocoaInput config")); - this.parent = parent; - } - private final Screen parent; - - @Override - protected void init() { - super.init(); - - Button done = this.addRenderableWidget(new Button(this.width/2 - 100,this.height - 28,200,20, - new TranslatableComponent("gui.done"), (button) -> { - for (EntryInfo info : entries) - try { info.field.set(null, info.value); } - catch (IllegalAccessException ignore) {} - write(); - minecraft.setScreen(parent); - })); - - int y = 45; - for (EntryInfo info : entries) { - if (info.widget instanceof Map.Entry) { - Map.Entry> widget = (Map.Entry>) info.widget; - addRenderableWidget(new Button(width-85,y,info.width,20, widget.getValue().apply(info.value), widget.getKey())); - } - else { - EditBox widget = addWidget(new EditBox(font, width-85, y, info.width, 20, null)); - widget.setValue(info.tempValue); - - Predicate processor = ((BiFunction>) info.widget).apply(widget,done); - widget.setFilter(processor); - processor.test(info.tempValue); - - addWidget(widget); - } - y += 30; - } - - } - - @Override - public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { - this.renderBackground(matrices); - - if (mouseY >= 40 && mouseY <= 39 + entries.size()*30) { - int low = ((mouseY-10)/30)*30 + 10 + 2; - fill(matrices, 0, low, width, low+30-4, 0x33FFFFFF); - } - - super.render(matrices, mouseX, mouseY, delta); - drawCenteredString(matrices, font, title, width/2, 15, 0xFFFFFF); - - int y = 40; - for (EntryInfo info : entries) { - drawString(matrices, font, new TextComponent(info.comment), 12, y + 10, 0xFFFFFF); - /* - if (info.error != null && info.error.getKey().isMouseOver(mouseX,mouseY)) - renderTooltip(matrices, info.error.getValue(), mouseX, mouseY); - else if (mouseY >= y && mouseY < (y + 30)) { - if (info.dynamicTooltip != null) { - try { - renderComponentTooltip(matrices, (List) info.dynamicTooltip.invoke(null, entries), mouseX, mouseY); - y += 30; - continue; - } catch (Exception e) { e.printStackTrace(); } - } - String key = translationPrefix + info.field.getName() + ".tooltip"; - - List list = new ArrayList<>(); - for (String str : I18n.get(key).split("\n")) - list.add(new TextComponent(str)); - renderComponentTooltip(matrices, list, mouseX, mouseY); - - } - */ - y += 30; - } - } + return new FabricConfigScreen(parent, this); } @Retention(RetentionPolicy.RUNTIME) diff --git a/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/config/fabric/FabricConfigScreen.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/config/fabric/FabricConfigScreen.java new file mode 100644 index 0000000..2ccd9c0 --- /dev/null +++ b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/config/fabric/FabricConfigScreen.java @@ -0,0 +1,98 @@ +package jp.axer.cocoainput.config.fabric; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.BaseComponent; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; + +import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.Predicate; + +public class FabricConfigScreen extends Screen { + private final FabricConfigImpl config; + + public FabricConfigScreen(Screen parent, FabricConfigImpl config) { + super(new TextComponent("CocoaInput config")); + this.parent = parent; + this.config = config; + } + private final Screen parent; + + @Override + protected void init() { + super.init(); + + Button done = this.addRenderableWidget(new Button(this.width/2 - 100,this.height - 28,200,20, + new TranslatableComponent("gui.done"), (button) -> { + for (FabricConfigImpl.EntryInfo info : config.entries) + try { info.field.set(null, info.value); } + catch (IllegalAccessException ignore) {} + config.write(); + minecraft.setScreen(parent); + })); + + int y = 45; + for (FabricConfigImpl.EntryInfo info : config.entries) { + if (info.widget instanceof Map.Entry) { + Map.Entry> widget = (Map.Entry>) info.widget; + addRenderableWidget(new Button(width-85,y,info.width,20, widget.getValue().apply(info.value), widget.getKey())); + } + else { + EditBox widget = addWidget(new EditBox(font, width-85, y, info.width, 20, null)); + widget.setValue(info.tempValue); + + Predicate processor = ((BiFunction>) info.widget).apply(widget,done); + widget.setFilter(processor); + processor.test(info.tempValue); + + addWidget(widget); + } + y += 30; + } + + } + + @Override + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + this.renderBackground(matrices); + + if (mouseY >= 40 && mouseY <= 39 + config.entries.size()*30) { + int low = ((mouseY-10)/30)*30 + 10 + 2; + fill(matrices, 0, low, width, low+30-4, 0x33FFFFFF); + } + + super.render(matrices, mouseX, mouseY, delta); + drawCenteredString(matrices, font, title, width/2, 15, 0xFFFFFF); + + int y = 40; + for (FabricConfigImpl.EntryInfo info : config.entries) { + drawString(matrices, font, new TextComponent(info.comment), 12, y + 10, 0xFFFFFF); + /* + if (info.error != null && info.error.getKey().isMouseOver(mouseX,mouseY)) + renderTooltip(matrices, info.error.getValue(), mouseX, mouseY); + else if (mouseY >= y && mouseY < (y + 30)) { + if (info.dynamicTooltip != null) { + try { + renderComponentTooltip(matrices, (List) info.dynamicTooltip.invoke(null, entries), mouseX, mouseY); + y += 30; + continue; + } catch (Exception e) { e.printStackTrace(); } + } + String key = translationPrefix + info.field.getName() + ".tooltip"; + + List list = new ArrayList<>(); + for (String str : I18n.get(key).split("\n")) + list.add(new TextComponent(str)); + renderComponentTooltip(matrices, list, mouseX, mouseY); + + } + */ + y += 30; + } + } +} diff --git a/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/config/fabric/WithDefaults.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/config/fabric/WithDefaults.java new file mode 100644 index 0000000..a3821f4 --- /dev/null +++ b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/config/fabric/WithDefaults.java @@ -0,0 +1,30 @@ +package jp.axer.cocoainput.config.fabric; + +import jp.axer.cocoainput.config.ConfigPack; + +import java.nio.file.Path; + +public class WithDefaults extends FabricConfigImpl implements ConfigPack{ + + @Entry(comment="AdvancedPreeditDraw - Is preedit marking - Default:true") + public static boolean advancedPreeditDraw=true; + @Entry(comment="NativeCharTyped - Is text inserted with native way - Default:true") + public static boolean nativeCharTyped=true; + + public WithDefaults(String modid, Path apath, Class config) { + super(modid, apath, config); + } + + @Override + public boolean isAdvancedPreeditDraw() { + // TODO 自動生成されたメソッド・スタブ + return advancedPreeditDraw; + } + @Override + public boolean isNativeCharTyped() { + // TODO 自動生成されたメソッド・スタブ + return nativeCharTyped; + } + + +} diff --git a/1.18.2/src/fabric/java/jp/axer/cocoainput/loader/CocoaInputModMenu.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/loader/CocoaInputModMenu.java similarity index 66% rename from 1.18.2/src/fabric/java/jp/axer/cocoainput/loader/CocoaInputModMenu.java rename to 1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/loader/CocoaInputModMenu.java index 98ddc0c..bacf00f 100644 --- a/1.18.2/src/fabric/java/jp/axer/cocoainput/loader/CocoaInputModMenu.java +++ b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/loader/CocoaInputModMenu.java @@ -3,12 +3,12 @@ import com.terraformersmc.modmenu.api.ModMenuApi; import com.terraformersmc.modmenu.api.ConfigScreenFactory; -import jp.axer.cocoainput.util.FCConfig; +import jp.axer.cocoainput.config.fabric.FabricConfigScreen; public class CocoaInputModMenu implements ModMenuApi { @Override public ConfigScreenFactory getModConfigScreenFactory() { - return parent -> (new FCConfig().getScreen(parent)); + return parent -> new FabricConfigScreen(parent, FabricLoader.instance.config); } } diff --git a/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/loader/FabricLoader.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/loader/FabricLoader.java new file mode 100644 index 0000000..176fe8b --- /dev/null +++ b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/loader/FabricLoader.java @@ -0,0 +1,60 @@ +package jp.axer.cocoainput.loader; + +import jp.axer.cocoainput.plugin.IMEReceiver; +import net.fabricmc.api.ClientModInitializer; +import jp.axer.cocoainput.CocoaInput; +import jp.axer.cocoainput.domain.*; +import jp.axer.cocoainput.mcutil.ModLogger; +import jp.axer.cocoainput.config.fabric.WithDefaults; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.client.Minecraft; +import jp.axer.cocoainput.domain.LibraryCopyImpl; + +import java.lang.reflect.Field; + +public class FabricLoader implements ClientModInitializer { + public static FabricLoader instance; + public CocoaInput cocoainput; + public WithDefaults config; + private static SimpleLogger loggerInstance; + + public static SimpleLogger getLoggerInstance() { + return loggerInstance; + } + + @Override + public void onInitializeClient() { + FabricLoader.instance=this; + } + public void onWindowLaunched(){ + var logger = new ModLogger(); + loggerInstance = logger; + MinecraftRawWindowIdAccessor rawWindowIdAccessor = () -> Minecraft.getInstance().getWindow().getWindow(); + var nativeLibraryLoader = new LibraryCopyImpl(logger, null); + ScreenScaleFactorGetter screenScaleFactorGetter = () -> Minecraft.getInstance().getWindow().getGuiScale(); + + this.cocoainput = new CocoaInput("Fabric", logger, rawWindowIdAccessor, nativeLibraryLoader, screenScaleFactorGetter); + logger.log("Fabric config setup"); + logger.log("Config path:"+net.fabricmc.loader.api.FabricLoader.getInstance().getConfigDir().resolve("cocoainput.json").toString()); + config = new WithDefaults("cocoainput",net.fabricmc.loader.api.FabricLoader.getInstance().getConfigDir().resolve("cocoainput.json"), WithDefaults.class); + logger.log("ConfigPack:"+config.isAdvancedPreeditDraw()+" "+config.isNativeCharTyped()); + } + + public void onChangeScreen(Screen sc){ + if(this.cocoainput==null){ + this.onWindowLaunched(); + return; + } + WrapperChecker w = () -> { + try { + Field wrapper = sc.getClass().getField("wrapper"); + wrapper.setAccessible(true); + return wrapper.get(sc) instanceof IMEReceiver; + } catch (Exception e) { + return false; + } + }; + + this.cocoainput.distributeScreen(w); + } +} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/util/ModLogger.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mcutil/ModLogger.java similarity index 58% rename from 1.18.2/src/main/java/jp/axer/cocoainput/util/ModLogger.java rename to 1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mcutil/ModLogger.java index 414b23f..1ef59d0 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/util/ModLogger.java +++ b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mcutil/ModLogger.java @@ -1,22 +1,23 @@ -package jp.axer.cocoainput.util; +package jp.axer.cocoainput.mcutil; +import jp.axer.cocoainput.domain.SimpleLogger; import org.apache.logging.log4j.Level; import org.apache.logging.log4j.LogManager; -public class ModLogger { +public class ModLogger implements SimpleLogger { public static boolean debugMode=true; - public static void log(String msg,Object...data){ + public void log(String msg,Object...data){ LogManager.getLogger("CocoaInput:Java").log( Level.INFO,msg, data); } - public static void error(String msg,Object...data){ + public void error(String msg,Object...data){ LogManager.getLogger("CocoaInput:Java").error(msg, data); } - public static void debug(String msg,Object...data){ + public void debug(String msg,Object...data){ if(debugMode){ LogManager.getLogger("CocoaInput:Java").debug(msg, data); } } -} \ No newline at end of file +} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/util/WrapperUtil.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mcutil/WrapperUtil.java similarity index 60% rename from 1.18.2/src/main/java/jp/axer/cocoainput/util/WrapperUtil.java rename to 1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mcutil/WrapperUtil.java index 2d15fd4..763d7c5 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/util/WrapperUtil.java +++ b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mcutil/WrapperUtil.java @@ -1,11 +1,11 @@ -package jp.axer.cocoainput.util; +package jp.axer.cocoainput.mcutil; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.screens.Screen; public class WrapperUtil { - public static Font makeFont(Screen owner) throws Exception { + public static Font makeFont(Screen owner) { return owner.font; } } diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/mixin/BookEditScreenMixin.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mixin/BookEditScreenMixin.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/mixin/BookEditScreenMixin.java rename to 1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mixin/BookEditScreenMixin.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/mixin/EditBoxMixin.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mixin/EditBoxMixin.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/mixin/EditBoxMixin.java rename to 1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mixin/EditBoxMixin.java diff --git a/1.18.2/src/fabric/java/jp/axer/cocoainput/mixin/MinecraftMixin.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mixin/MinecraftMixin.java similarity index 100% rename from 1.18.2/src/fabric/java/jp/axer/cocoainput/mixin/MinecraftMixin.java rename to 1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mixin/MinecraftMixin.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/mixin/SharedConstantsMixin.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mixin/SharedConstantsMixin.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/mixin/SharedConstantsMixin.java rename to 1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mixin/SharedConstantsMixin.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/mixin/SignEditScreenMixin.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mixin/SignEditScreenMixin.java similarity index 100% rename from 1.18.2/src/main/java/jp/axer/cocoainput/mixin/SignEditScreenMixin.java rename to 1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/mixin/SignEditScreenMixin.java diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/wrapper/BookEditScreenWrapper.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/wrapper/BookEditScreenWrapper.java similarity index 92% rename from 1.18.2/src/main/java/jp/axer/cocoainput/wrapper/BookEditScreenWrapper.java rename to 1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/wrapper/BookEditScreenWrapper.java index bd55c13..e6c383a 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/wrapper/BookEditScreenWrapper.java +++ b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/wrapper/BookEditScreenWrapper.java @@ -4,11 +4,12 @@ import java.util.Optional; import jp.axer.cocoainput.CocoaInput; +import jp.axer.cocoainput.loader.FabricLoader; import jp.axer.cocoainput.plugin.IMEOperator; import jp.axer.cocoainput.plugin.IMEReceiver; -import jp.axer.cocoainput.util.ModLogger; -import jp.axer.cocoainput.util.Rect; -import jp.axer.cocoainput.util.WrapperUtil; +import jp.axer.cocoainput.domain.SimpleLogger; +import jp.axer.cocoainput.domain.Rect; +import jp.axer.cocoainput.mcutil.WrapperUtil; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.screens.inventory.BookEditScreen; import net.minecraft.client.StringSplitter; @@ -20,7 +21,7 @@ public class BookEditScreenWrapper extends IMEReceiver { private BookEditScreen owner; public BookEditScreenWrapper(BookEditScreen field) { - ModLogger.log("BookEditScreen init: " + field.hashCode()); + FabricLoader.getLoggerInstance().log("BookEditScreen init: " + field.hashCode()); owner = field; myIME = CocoaInput.getController().generateIMEOperator(this); myIME.setFocused(true); diff --git a/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/wrapper/EditBoxWrapper.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/wrapper/EditBoxWrapper.java new file mode 100644 index 0000000..e246c87 --- /dev/null +++ b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/wrapper/EditBoxWrapper.java @@ -0,0 +1,79 @@ + +package jp.axer.cocoainput.wrapper; + +import jp.axer.cocoainput.CocoaInput; +import jp.axer.cocoainput.loader.FabricLoader; +import jp.axer.cocoainput.plugin.IMEOperator; +import jp.axer.cocoainput.plugin.IMEReceiver; +import jp.axer.cocoainput.domain.Rect; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.network.chat.TextComponent; + +public class EditBoxWrapper extends IMEReceiver { + private IMEOperator myIME; + private EditBox owner; + + public EditBoxWrapper(EditBox field) { + FabricLoader.getLoggerInstance().log("BookEditScreen init: " + field.hashCode()); + owner = field; + myIME = CocoaInput.getController().generateIMEOperator(this); + } + + public void setCanLoseFocus(boolean newParam) { + if (!newParam) setFocused(true); + } + + public void setFocused(boolean newParam) { + owner.setFormatter( ((abc,def) -> new TextComponent(abc).getVisualOrderText() )); + myIME.setFocused(newParam); + } + + + public void updateCursorCounter() { + if (cursorVisible) owner.frame++; + } + + protected void setText(String text) { + owner.value=text; + } + + protected String getText() { + return owner.value; + } + + protected void setCursorInvisible() { + owner.frame=6; + } + + protected int getCursorPos() { + return owner.getCursorPosition(); + } + + protected void setCursorPos(int p) { + owner.moveCursorTo(p); + } + + protected void setSelectionPos(int p) { + owner.setHighlightPos(p); + } + + + @Override + public Rect getRect() { + return new Rect(//{x,y} + (owner.font.width(owner.getValue().substring(0, originalCursorPosition)) + (owner.bordered ? owner.x + 4 : owner.x)), + (owner.font.lineHeight + (owner.bordered ? owner.y + (owner.getHeight() - 8) / 2 : owner.y)), + owner.getWidth(), + owner.getHeight() + + ); + } + + protected void notifyParent(String text) { + // TODO 自動生成されたメソッド・スタブ + owner.onValueChange(text); + + } + + +} diff --git a/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/wrapper/SignEditScreenWrapper.java b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/wrapper/SignEditScreenWrapper.java new file mode 100644 index 0000000..e236f3e --- /dev/null +++ b/1.18.2/fabric/src/fabric/java/jp/axer/cocoainput/wrapper/SignEditScreenWrapper.java @@ -0,0 +1,78 @@ +package jp.axer.cocoainput.wrapper; + +import jp.axer.cocoainput.CocoaInput; +import jp.axer.cocoainput.loader.FabricLoader; +import jp.axer.cocoainput.plugin.IMEOperator; +import jp.axer.cocoainput.plugin.IMEReceiver; +import jp.axer.cocoainput.domain.Rect; +import jp.axer.cocoainput.mcutil.WrapperUtil; +import net.minecraft.world.level.block.StandingSignBlock; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.screens.inventory.SignEditScreen; +import net.minecraft.network.chat.TextComponent; + +public class SignEditScreenWrapper extends IMEReceiver { + private SignEditScreen owner; + private IMEOperator myIME; + + + public SignEditScreenWrapper(SignEditScreen field) { + FabricLoader.getLoggerInstance().log("BookEditScreen init: " + field.hashCode()); + owner = field; + myIME = CocoaInput.getController().generateIMEOperator(this); + myIME.setFocused(true); + } + + protected void setText(String text) { + owner.sign.setMessage(owner.line,new TextComponent(text)); + String [] util = owner.messages; + util[owner.line]=text; + } + + protected String getText() { + return owner.sign.getMessage(owner.line,false).getString(); + } + + protected void setCursorInvisible() { + owner.frame=6; + } //TODO + + protected int getCursorPos() { + return owner.signField.getCursorPos(); + } + + protected void setCursorPos(int p) { + owner.signField.setCursorPos(p,true); + } + + protected void setSelectionPos(int p) { + owner.signField.setSelectionRange(p,p); + } + + + @Override + public Rect getRect() { + + Font fontRendererObj = null; + try { + fontRendererObj = WrapperUtil.makeFont(owner); + } catch (Exception e) { + e.printStackTrace(); + } + float y = 91 + (owner.line - 1) * (10); + if (!(owner.sign.getBlockState().getBlock() instanceof StandingSignBlock)) { + y += 30; + } + return new Rect( + owner.width/2+fontRendererObj.width(owner.sign.getMessage(owner.line,false).toString().substring(0, originalCursorPosition))/2, +// owner.width / 2 + fontRendererObj.width(owner.sign.getMessage(owner.line,false).getString()) / 2, + y, + 0, + 0 + ); + } + public int renewCursorCounter() { + return owner.frame+(cursorVisible?1:0); + } + +} diff --git a/1.18.2/src/fabric/resources/assets/modid/icon.png b/1.18.2/fabric/src/fabric/resources/assets/modid/icon.png similarity index 100% rename from 1.18.2/src/fabric/resources/assets/modid/icon.png rename to 1.18.2/fabric/src/fabric/resources/assets/modid/icon.png diff --git a/1.18.2/src/fabric/resources/cocoafab.mixins.json b/1.18.2/fabric/src/fabric/resources/cocoafab.mixins.json similarity index 100% rename from 1.18.2/src/fabric/resources/cocoafab.mixins.json rename to 1.18.2/fabric/src/fabric/resources/cocoafab.mixins.json diff --git a/1.18.2/src/fabric/resources/cocoainput.accesswidener b/1.18.2/fabric/src/fabric/resources/cocoainput.accesswidener similarity index 100% rename from 1.18.2/src/fabric/resources/cocoainput.accesswidener rename to 1.18.2/fabric/src/fabric/resources/cocoainput.accesswidener diff --git a/1.18.2/src/fabric/resources/fabric.mod.json b/1.18.2/fabric/src/fabric/resources/fabric.mod.json similarity index 98% rename from 1.18.2/src/fabric/resources/fabric.mod.json rename to 1.18.2/fabric/src/fabric/resources/fabric.mod.json index 0f9736c..2b95fc5 100644 --- a/1.18.2/src/fabric/resources/fabric.mod.json +++ b/1.18.2/fabric/src/fabric/resources/fabric.mod.json @@ -35,7 +35,7 @@ "another-mod": "*" }, "accessWidener":"cocoainput.accesswidener", -"mixins": [ + "mixins": [ "cocoainput.mixins.json", "cocoafab.mixins.json" ] diff --git a/1.18.2/fabric/wslgradlew b/1.18.2/fabric/wslgradlew deleted file mode 100755 index 0b9b236..0000000 --- a/1.18.2/fabric/wslgradlew +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -cmd.exe /c 'SET JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-17.0.1.12-hotspot&gradlew '"$@" diff --git a/1.18.2/forge/.gitignore b/1.18.2/forge/.gitignore index a7de7e1..378eac2 100644 --- a/1.18.2/forge/.gitignore +++ b/1.18.2/forge/.gitignore @@ -1,18 +1 @@ -/* - -.DS_Store -*.dylib -*.so -*.dll -*.o - - -!.gitignore -!gradle -!gradle.properties -!gradlew -!gradlew.bat -!wslgradlew -!preprocess.sh -!build.gradle -!settings.gradle +build diff --git a/1.18.2/forge/build.gradle b/1.18.2/forge/build.gradle index baae871..b52dcf8 100644 --- a/1.18.2/forge/build.gradle +++ b/1.18.2/forge/build.gradle @@ -12,12 +12,19 @@ buildscript { classpath group: 'org.spongepowered', name: 'mixingradle', version: '0.7-SNAPSHOT' } } + +plugins { + id "com.github.johnrengelman.shadow" version "7.1.2" +} + apply plugin: 'net.minecraftforge.gradle' // Only edit below this line, the above code adds and enables the necessary things for Forge to be setup. apply plugin: 'eclipse' apply plugin: 'maven-publish' apply plugin: 'org.spongepowered.mixin' +evaluationDependsOn(':core') + version = '4.0.4' group = 'jp.axer.cocoainput' // http://maven.apache.org/guides/mini/guide-naming-conventions.html archivesBaseName = 'CocoaInput-1.18-forge' @@ -36,7 +43,7 @@ minecraft { // makeObfSourceJar = false // an Srg named sources jar is made by default. uncomment this to disable. // accessTransformer = file('build/resources/main/META-INF/accesstransformer.cfg') - accessTransformer = file('../src/forge/resources/META-INF/accesstransformer.cfg') + accessTransformer = file('src/forge/resources/META-INF/accesstransformer.cfg') // Default run configurations. // These can be tweaked, removed, or duplicated as needed. @@ -51,13 +58,12 @@ minecraft { property 'forge.logging.console.level', 'debug' arg "-mixin.config=cocoainput.mixins.json" - sourceSets.main.java.srcDirs+=['../src/forge/java'] - sourceSets.main.java.srcDirs+=['../src/main/java'] - sourceSets.main.resources.srcDirs+=['../src/forge/resources'] - sourceSets.main.resources.srcDirs+=['../src/main/resources'] + sourceSets.main.java.srcDirs=['src/forge/java'] + sourceSets.main.resources.srcDirs=['src/forge/resources'] mods { examplemod { source sourceSets.main + source project(':core').sourceSets.main } } } @@ -109,8 +115,13 @@ dependencies { // http://www.gradle.org/docs/current/userguide/dependency_management.html annotationProcessor 'org.spongepowered:mixin:0.8.4:processor' + implementation project(':core') } +tasks.build { + // domain + dependsOn(tasks.shadowJar) +} // Example for how to get properties into the manifest for reading by the runtime.. jar { diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/config/forge/ForgeConfigImpl.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/config/forge/ForgeConfigImpl.java new file mode 100644 index 0000000..62a5148 --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/config/forge/ForgeConfigImpl.java @@ -0,0 +1,175 @@ +package jp.axer.cocoainput.config.forge; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.BaseComponent; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.*; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.Predicate; +import java.util.regex.Pattern; + +public class ForgeConfigImpl { + + private static final Pattern INTEGER_ONLY = Pattern.compile("(-?[0-9]*)"); + private static final Pattern DECIMAL_ONLY = Pattern.compile("-?([\\d]+\\.?[\\d]*|[\\d]*\\.?[\\d]+|\\.)"); + + final List entries = new ArrayList<>(); + + protected static class EntryInfo { + Field field; + Object widget; + int width; + String comment; + Method dynamicTooltip; + Map.Entry error; + Object defaultValue; + Object value; + String tempValue; + boolean inLimits = true; + } + + private final Class configClass; + private final String translationPrefix; + private final Path path; + + private static final Gson gson = new GsonBuilder() + .excludeFieldsWithModifiers(Modifier.TRANSIENT) + .excludeFieldsWithModifiers(Modifier.PRIVATE) + .setPrettyPrinting() + .create(); + + public ForgeConfigImpl(String modid, Path apath, Class config) { + translationPrefix = modid + ".tinyconfig."; + configClass = config; + path = apath; + + for (Field field : config.getFields()) { + Entry e; + try { e = field.getAnnotation(Entry.class); } + catch (Exception ignored) { continue; } + if(e==null) {continue;} + Class type = field.getType(); + EntryInfo info = new EntryInfo(); + info.width = e.width(); + info.field = field; + + if (type == int.class) textField(info, Integer::parseInt, INTEGER_ONLY, e.min(), e.max(), true); + else if (type == double.class) textField(info, Double::parseDouble, DECIMAL_ONLY, e.min(), e.max(),false); + else if (type == String.class) textField(info, String::length, null, Math.min(e.min(),0), Math.max(e.max(),1),true); + else if (type == boolean.class) { + Function func = value -> new TextComponent((Boolean) value ? "True" : "False"); + info.widget = new AbstractMap.SimpleEntry>(button -> { + info.value = !(Boolean) info.value; + button.setMessage(func.apply(info.value)); + }, func); + } + else if (type.isEnum()) { + List values = Arrays.asList(field.getType().getEnumConstants()); + Function func = value -> new TranslatableComponent(translationPrefix + "enum." + type.getSimpleName() + "." + info.value.toString()); + info.widget = new AbstractMap.SimpleEntry>( button -> { + int index = values.indexOf(info.value) + 1; + info.value = values.get(index >= values.size()? 0 : index); + button.setMessage(func.apply(info.value)); + }, func); + } + else + continue; + + entries.add(info); + + try { info.defaultValue = field.get(null); } + catch (IllegalAccessException ignored) {} + + try { + info.dynamicTooltip = config.getMethod(e.dynamicTooltip()); + info.dynamicTooltip.setAccessible(true); + } catch (Exception ignored) {} + info.comment=e.comment(); + } + + try { gson.fromJson(Files.newBufferedReader(path), config); } + catch (Exception e) { write(); } + + for (EntryInfo info : entries) { + try { + info.value = info.field.get(null); + info.tempValue = info.value.toString(); + } + catch (IllegalAccessException ignored) {} + } + + } + + private void textField(EntryInfo info, Function f, Pattern pattern, double min, double max, boolean cast) { + boolean isNumber = pattern != null; + info.widget = (BiFunction>) (t, b) -> s -> { + s = s.trim(); + if (!(s.isEmpty() || !isNumber || pattern.matcher(s).matches())) + return false; + + Number value = 0; + boolean inLimits = false; + System.out.println(((isNumber ^ s.isEmpty()))); + System.out.println(!s.equals("-") && !s.equals(".")); + info.error = null; + if (!(isNumber && s.isEmpty()) && !s.equals("-") && !s.equals(".")) { + value = f.apply(s); + inLimits = value.doubleValue() >= min && value.doubleValue() <= max; + info.error = inLimits? null : new AbstractMap.SimpleEntry<>(t, new TextComponent(value.doubleValue() < min ? + "§cMinimum " + (isNumber? "value" : "length") + (cast? " is " + (int)min : " is " + min) : + "§cMaximum " + (isNumber? "value" : "length") + (cast? " is " + (int)max : " is " + max))); + } + + info.tempValue = s; + t.setTextColor(inLimits? 0xFFFFFFFF : 0xFFFF7777); + info.inLimits = inLimits; + b.active = entries.stream().allMatch(e -> e.inLimits); + + if (inLimits) + info.value = isNumber? value : s; + + return true; + }; + } + + public void write() { + try { + if (!Files.exists(path)) Files.createFile(path); + Files.write(path, gson.toJson(this).getBytes()); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + public Screen getScreen(Screen parent) { + return new ForgeConfigScreen(parent, this); + } + + @Retention(RetentionPolicy.RUNTIME) + @Target(ElementType.FIELD) + public @interface Entry { + String comment() default ""; + String dynamicTooltip() default ""; + int width() default 75; + double min() default Double.MIN_NORMAL; + double max() default Double.MAX_VALUE; + } + +} \ No newline at end of file diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/config/forge/ForgeConfigScreen.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/config/forge/ForgeConfigScreen.java new file mode 100644 index 0000000..d05bcff --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/config/forge/ForgeConfigScreen.java @@ -0,0 +1,99 @@ +package jp.axer.cocoainput.config.forge; + +import com.mojang.blaze3d.vertex.PoseStack; +import jp.axer.cocoainput.config.forge.ForgeConfigImpl; +import net.minecraft.client.gui.components.Button; +import net.minecraft.client.gui.components.EditBox; +import net.minecraft.client.gui.screens.Screen; +import net.minecraft.network.chat.BaseComponent; +import net.minecraft.network.chat.TextComponent; +import net.minecraft.network.chat.TranslatableComponent; + +import java.util.Map; +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.Predicate; + +public class ForgeConfigScreen extends Screen { + private final ForgeConfigImpl config; + + public ForgeConfigScreen(Screen parent, ForgeConfigImpl config) { + super(new TextComponent("CocoaInput config")); + this.parent = parent; + this.config = config; + } + private final Screen parent; + + @Override + protected void init() { + super.init(); + + Button done = this.addRenderableWidget(new Button(this.width/2 - 100,this.height - 28,200,20, + new TranslatableComponent("gui.done"), (button) -> { + for (ForgeConfigImpl.EntryInfo info : config.entries) + try { info.field.set(null, info.value); } + catch (IllegalAccessException ignore) {} + config.write(); + minecraft.setScreen(parent); + })); + + int y = 45; + for (ForgeConfigImpl.EntryInfo info : config.entries) { + if (info.widget instanceof Map.Entry) { + Map.Entry> widget = (Map.Entry>) info.widget; + addRenderableWidget(new Button(width-85,y,info.width,20, widget.getValue().apply(info.value), widget.getKey())); + } + else { + EditBox widget = addWidget(new EditBox(font, width-85, y, info.width, 20, null)); + widget.setValue(info.tempValue); + + Predicate processor = ((BiFunction>) info.widget).apply(widget,done); + widget.setFilter(processor); + processor.test(info.tempValue); + + addWidget(widget); + } + y += 30; + } + + } + + @Override + public void render(PoseStack matrices, int mouseX, int mouseY, float delta) { + this.renderBackground(matrices); + + if (mouseY >= 40 && mouseY <= 39 + config.entries.size()*30) { + int low = ((mouseY-10)/30)*30 + 10 + 2; + fill(matrices, 0, low, width, low+30-4, 0x33FFFFFF); + } + + super.render(matrices, mouseX, mouseY, delta); + drawCenteredString(matrices, font, title, width/2, 15, 0xFFFFFF); + + int y = 40; + for (ForgeConfigImpl.EntryInfo info : config.entries) { + drawString(matrices, font, new TextComponent(info.comment), 12, y + 10, 0xFFFFFF); + /* + if (info.error != null && info.error.getKey().isMouseOver(mouseX,mouseY)) + renderTooltip(matrices, info.error.getValue(), mouseX, mouseY); + else if (mouseY >= y && mouseY < (y + 30)) { + if (info.dynamicTooltip != null) { + try { + renderComponentTooltip(matrices, (List) info.dynamicTooltip.invoke(null, entries), mouseX, mouseY); + y += 30; + continue; + } catch (Exception e) { e.printStackTrace(); } + } + String key = translationPrefix + info.field.getName() + ".tooltip"; + + List list = new ArrayList<>(); + for (String str : I18n.get(key).split("\n")) + list.add(new TextComponent(str)); + renderComponentTooltip(matrices, list, mouseX, mouseY); + + } + */ + y += 30; + } + } +} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/util/FCConfig.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/config/forge/WithDefaults.java similarity index 60% rename from 1.18.2/src/main/java/jp/axer/cocoainput/util/FCConfig.java rename to 1.18.2/forge/src/forge/java/jp/axer/cocoainput/config/forge/WithDefaults.java index b865af2..fe86957 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/util/FCConfig.java +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/config/forge/WithDefaults.java @@ -1,17 +1,21 @@ -package jp.axer.cocoainput.util; +package jp.axer.cocoainput.config.forge; -import jp.axer.cocoainput.util.ConfigPack; +import jp.axer.cocoainput.config.ConfigPack; -public class FCConfig extends TinyConfig implements ConfigPack{ +import java.nio.file.Path; + +public class WithDefaults extends ForgeConfigImpl implements ConfigPack{ @Entry(comment="AdvancedPreeditDraw - Is preedit marking - Default:true") public static boolean advancedPreeditDraw=true; @Entry(comment="NativeCharTyped - Is text inserted with native way - Default:true") public static boolean nativeCharTyped=true; + public WithDefaults(String modid, Path apath, Class config) { + super(modid, apath, config); + } - - @Override + @Override public boolean isAdvancedPreeditDraw() { // TODO 自動生成されたメソッド・スタブ return advancedPreeditDraw; diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/loader/ForgeLoader.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/loader/ForgeLoader.java new file mode 100644 index 0000000..5166198 --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/loader/ForgeLoader.java @@ -0,0 +1,81 @@ +package jp.axer.cocoainput.loader; + +import jp.axer.cocoainput.CocoaInput; +import jp.axer.cocoainput.config.forge.ForgeConfigImpl; +import jp.axer.cocoainput.config.forge.ForgeConfigScreen; +import jp.axer.cocoainput.config.forge.WithDefaults; +import jp.axer.cocoainput.domain.*; +import jp.axer.cocoainput.mcutil.ModLogger; +import jp.axer.cocoainput.plugin.IMEReceiver; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import net.minecraftforge.client.event.ScreenOpenEvent; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.SubscribeEvent; +import net.minecraftforge.client.ConfigGuiHandler; + +import net.minecraftforge.fml.ModList; +import net.minecraftforge.fml.ModLoadingContext; +import net.minecraftforge.fml.common.Mod; +import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; +import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; +import net.minecraftforge.fml.loading.FMLPaths; + +import java.lang.reflect.Field; + +@Mod("cocoainput") +public class ForgeLoader { + private CocoaInput instance; + private WithDefaults config; + private static SimpleLogger logger; + private static ForgeLoader modInstance; + + public static SimpleLogger getLoggerInstance() { + return logger; + } + + public static ForgeLoader getModInstance() { + return modInstance; + } + + public ForgeLoader(){ + FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); + MinecraftForge.EVENT_BUS.register(this); + } + + private void setup(final FMLCommonSetupEvent event) { + modInstance = this; + logger = new ModLogger(); + var zip = ModList.get().getModFileById("cocoainput").getFile().getFilePath().toString(); + MinecraftRawWindowIdAccessor rawWindowIdAccessor = () -> Minecraft.getInstance().getWindow().getWindow(); + var nativeLibraryLoader = new LibraryCopyImpl(logger, zip, () -> Minecraft.getInstance().gameDirectory.getAbsolutePath()); + ScreenScaleFactorGetter screenScaleFactorGetter = () -> Minecraft.getInstance().getWindow().getGuiScale(); + this.instance=new CocoaInput("MinecraftForge", logger, rawWindowIdAccessor, nativeLibraryLoader, screenScaleFactorGetter); + logger.log("Forge config setup"); + logger.log("Config path:"+FMLPaths.CONFIGDIR.get().resolve("cocoainput.json").toString()); + config = new WithDefaults("cocoainput",FMLPaths.CONFIGDIR.get().resolve("cocoainput.json"), WithDefaults.class); + ModLoadingContext.get().registerExtensionPoint( + ConfigGuiHandler.ConfigGuiFactory.class, () -> + new ConfigGuiHandler.ConfigGuiFactory((mc,modListScreen)->new ForgeConfigScreen(modListScreen, config))); + logger.log("ConfigPack:"+config.isAdvancedPreeditDraw()+" "+config.isNativeCharTyped()); + } + @SubscribeEvent + public void didChangeGui(ScreenOpenEvent event) { + var sc = event.getScreen(); + onOpenScreen(sc); + } + + public void onOpenScreen(Screen sc) { + WrapperChecker w = () -> { + try { + Field wrapper = sc.getClass().getField("wrapper"); + wrapper.setAccessible(true); + return wrapper.get(sc) instanceof IMEReceiver; + } catch (Exception e) { + return false; + } + }; + + this.instance.distributeScreen(w); + } +} diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mcutil/ModLogger.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mcutil/ModLogger.java new file mode 100644 index 0000000..1ef59d0 --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mcutil/ModLogger.java @@ -0,0 +1,23 @@ +package jp.axer.cocoainput.mcutil; + +import jp.axer.cocoainput.domain.SimpleLogger; +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.LogManager; + +public class ModLogger implements SimpleLogger { + public static boolean debugMode=true; + + public void log(String msg,Object...data){ + LogManager.getLogger("CocoaInput:Java").log( Level.INFO,msg, data); + } + + public void error(String msg,Object...data){ + LogManager.getLogger("CocoaInput:Java").error(msg, data); + } + + public void debug(String msg,Object...data){ + if(debugMode){ + LogManager.getLogger("CocoaInput:Java").debug(msg, data); + } + } +} diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mcutil/WrapperUtil.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mcutil/WrapperUtil.java new file mode 100644 index 0000000..763d7c5 --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mcutil/WrapperUtil.java @@ -0,0 +1,11 @@ +package jp.axer.cocoainput.mcutil; + +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.screens.Screen; + + +public class WrapperUtil { + public static Font makeFont(Screen owner) { + return owner.font; + } +} diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/BookEditScreenMixin.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/BookEditScreenMixin.java new file mode 100644 index 0000000..6734b20 --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/BookEditScreenMixin.java @@ -0,0 +1,25 @@ +package jp.axer.cocoainput.mixin; + +import jp.axer.cocoainput.wrapper.BookEditScreenWrapper; +import net.minecraft.client.gui.screens.inventory.BookEditScreen; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(BookEditScreen.class) +public class BookEditScreenMixin { + BookEditScreenWrapper wrapper; + + @Inject(method="init*",at=@At("RETURN")) + private void init(CallbackInfo ci) { + wrapper = new BookEditScreenWrapper((BookEditScreen)(Object)this); + } + + @Redirect(method="tick",at = @At(value="FIELD", target="Lnet/minecraft/client/gui/screens/inventory/BookEditScreen;frameTick:I",opcode=Opcodes.PUTFIELD)) + private void injectCurosr(BookEditScreen esc,int n) { + esc.frameTick=wrapper.renewCursorCounter(); + } +} diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/EditBoxMixin.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/EditBoxMixin.java new file mode 100644 index 0000000..23c7cd7 --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/EditBoxMixin.java @@ -0,0 +1,32 @@ +package jp.axer.cocoainput.mixin; + +import jp.axer.cocoainput.wrapper.EditBoxWrapper; +import net.minecraft.client.gui.components.EditBox; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(EditBox.class) +public class EditBoxMixin { + EditBoxWrapper wrapper; + + @Inject(method="*",at=@At("RETURN")) + private void init(CallbackInfo ci) { + wrapper = new EditBoxWrapper((EditBox)(Object)this); + } + + @Inject(method="setFocus",at=@At("HEAD")) + private void setFocus(boolean b,CallbackInfo ci) { + wrapper.setFocused(b); + } + @Inject(method="setCanLoseFocus",at=@At("HEAD")) + private void setCanLoseFocus(boolean b,CallbackInfo ci) { + wrapper.setCanLoseFocus(b); + } + @Inject(method="tick",at=@At("HEAD"),cancellable=true) + private void tick(CallbackInfo ci) { + wrapper.updateCursorCounter(); + ci.cancel(); + } +} diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/MinecraftMixin.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/MinecraftMixin.java new file mode 100644 index 0000000..59d107f --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/MinecraftMixin.java @@ -0,0 +1,17 @@ +package jp.axer.cocoainput.mixin; + +import jp.axer.cocoainput.loader.ForgeLoader; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screens.Screen; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(Minecraft.class) +public class MinecraftMixin { + @Inject(method="setScreen",at=@At("HEAD")) + private void setScreen(Screen screen,CallbackInfo ci) { + ForgeLoader.getModInstance().onOpenScreen(screen); + } +} diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/SharedConstantsMixin.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/SharedConstantsMixin.java new file mode 100644 index 0000000..c419b22 --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/SharedConstantsMixin.java @@ -0,0 +1,17 @@ +package jp.axer.cocoainput.mixin; + +import net.minecraft.SharedConstants; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Overwrite; + + +@Mixin(SharedConstants.class) +public class SharedConstantsMixin { + //@ModifyConstant(method="isAllowedChatCharacter",constant=@Constant(intValue=167)) + //@Inject(at=@At("HEAD"),method="isAllowedChatCharacter") + @Overwrite + public static boolean isAllowedChatCharacter(char p) { + return p>=' '&&p!=127; + } + +} diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/SignEditScreenMixin.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/SignEditScreenMixin.java new file mode 100644 index 0000000..a499dd5 --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/mixin/SignEditScreenMixin.java @@ -0,0 +1,25 @@ +package jp.axer.cocoainput.mixin; + +import jp.axer.cocoainput.wrapper.SignEditScreenWrapper; +import net.minecraft.client.gui.screens.inventory.SignEditScreen; +import org.objectweb.asm.Opcodes; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.Redirect; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; + +@Mixin(SignEditScreen.class) +public class SignEditScreenMixin { + SignEditScreenWrapper wrapper; + + @Inject(method="init",at=@At("RETURN")) + private void init(CallbackInfo ci) { + wrapper = new SignEditScreenWrapper((SignEditScreen)(Object)this); + } + + @Redirect(method="tick",at = @At(value="FIELD", target="Lnet/minecraft/client/gui/screens/inventory/SignEditScreen;frame:I",opcode=Opcodes.PUTFIELD)) + private void injectCurosr(SignEditScreen esc,int n) { + esc.frame=wrapper.renewCursorCounter(); + } +} diff --git a/1.18.2/forge/src/forge/java/jp/axer/cocoainput/wrapper/BookEditScreenWrapper.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/wrapper/BookEditScreenWrapper.java new file mode 100644 index 0000000..d1705d8 --- /dev/null +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/wrapper/BookEditScreenWrapper.java @@ -0,0 +1,116 @@ +package jp.axer.cocoainput.wrapper; + +import jp.axer.cocoainput.CocoaInput; +import jp.axer.cocoainput.domain.Rect; +import jp.axer.cocoainput.loader.ForgeLoader; +import jp.axer.cocoainput.mcutil.WrapperUtil; +import jp.axer.cocoainput.plugin.IMEOperator; +import jp.axer.cocoainput.plugin.IMEReceiver; +import net.minecraft.client.StringSplitter; +import net.minecraft.client.gui.Font; +import net.minecraft.client.gui.screens.inventory.BookEditScreen; +import net.minecraft.network.chat.FormattedText; +import net.minecraft.network.chat.Style; + +import java.util.List; +import java.util.Optional; + +public class BookEditScreenWrapper extends IMEReceiver { + private IMEOperator myIME; + private BookEditScreen owner; + + public BookEditScreenWrapper(BookEditScreen field) { + ForgeLoader.getLoggerInstance().log("BookEditScreen init: " + field.hashCode()); + owner = field; + myIME = CocoaInput.getController().generateIMEOperator(this); + myIME.setFocused(true); + } + + protected void setText(String text) { + if(owner.isSigning) { + owner.title=text; + } + else { + owner.setCurrentPageText(text); + } + } + + protected String getText() { + if(owner.isSigning) { + return owner.title; + } + else { + return owner.getCurrentPageText(); + } + } + + protected void setCursorInvisible() { + owner.frameTick=6; + } //TODO + + protected int getCursorPos() { + if(owner.isSigning) { + return owner.titleEdit.getCursorPos(); + } + else { + return owner.pageEdit.getCursorPos(); + } + } + + protected void setCursorPos(int p) { + if(owner.isSigning) { + owner.titleEdit.setCursorPos(p,true); + } + else { + owner.pageEdit.setCursorPos(p,true); + } + } + + protected void setSelectionPos(int p) { + if(owner.isSigning) { + owner.titleEdit.setSelectionRange(p, p); + } + else { + owner.pageEdit.setSelectionRange(p, p); + } + } + + + @Override + public Rect getRect() { + Font fontRendererObj = null; + try { + fontRendererObj = WrapperUtil.makeFont(owner); + } catch (Exception e) { + e.printStackTrace(); + } + if (owner.isSigning) { + return new Rect( + (fontRendererObj.width(owner.title.substring(0, originalCursorPosition)) / 2 + ((owner.width - 192) / 2) + 36 + (116 - 0) / 2), + (50 + fontRendererObj.lineHeight), + 0, + 0 + ); + } else { + StringSplitter manager = fontRendererObj.getSplitter(); + List lines = manager.splitLines(owner.getCurrentPageText(), 116, Style.EMPTY); + final String[] lastLine = new String[1]; + FormattedText.ContentConsumer acceptor = p_accept_1_ -> { + lastLine[0] = p_accept_1_; + return Optional.empty(); + }; + lines.get(lines.size() - 1).visit(acceptor); + return new Rect( + (((owner.width - 192) / 2) + 36 + fontRendererObj.width(lastLine[0])), + (34 + lines.size() * fontRendererObj.lineHeight), + 0, + 0 + ); + } + } + + public int renewCursorCounter() { + return owner.frameTick+(cursorVisible?1:0); + } + +} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/wrapper/EditBoxWrapper.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/wrapper/EditBoxWrapper.java similarity index 91% rename from 1.18.2/src/main/java/jp/axer/cocoainput/wrapper/EditBoxWrapper.java rename to 1.18.2/forge/src/forge/java/jp/axer/cocoainput/wrapper/EditBoxWrapper.java index 76eeca6..26beaaf 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/wrapper/EditBoxWrapper.java +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/wrapper/EditBoxWrapper.java @@ -2,10 +2,10 @@ package jp.axer.cocoainput.wrapper; import jp.axer.cocoainput.CocoaInput; +import jp.axer.cocoainput.domain.Rect; +import jp.axer.cocoainput.loader.ForgeLoader; import jp.axer.cocoainput.plugin.IMEOperator; import jp.axer.cocoainput.plugin.IMEReceiver; -import jp.axer.cocoainput.util.ModLogger; -import jp.axer.cocoainput.util.Rect; import net.minecraft.client.gui.components.EditBox; import net.minecraft.network.chat.TextComponent; @@ -14,7 +14,7 @@ public class EditBoxWrapper extends IMEReceiver { private EditBox owner; public EditBoxWrapper(EditBox field) { - ModLogger.debug("EditBox init: " + field.hashCode()); + ForgeLoader.getLoggerInstance().log("BookEditScreen init: " + field.hashCode()); owner = field; myIME = CocoaInput.getController().generateIMEOperator(this); } diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/wrapper/SignEditScreenWrapper.java b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/wrapper/SignEditScreenWrapper.java similarity index 90% rename from 1.18.2/src/main/java/jp/axer/cocoainput/wrapper/SignEditScreenWrapper.java rename to 1.18.2/forge/src/forge/java/jp/axer/cocoainput/wrapper/SignEditScreenWrapper.java index 8ecae4d..1162386 100644 --- a/1.18.2/src/main/java/jp/axer/cocoainput/wrapper/SignEditScreenWrapper.java +++ b/1.18.2/forge/src/forge/java/jp/axer/cocoainput/wrapper/SignEditScreenWrapper.java @@ -1,15 +1,15 @@ package jp.axer.cocoainput.wrapper; import jp.axer.cocoainput.CocoaInput; +import jp.axer.cocoainput.domain.Rect; +import jp.axer.cocoainput.loader.ForgeLoader; +import jp.axer.cocoainput.mcutil.WrapperUtil; import jp.axer.cocoainput.plugin.IMEOperator; import jp.axer.cocoainput.plugin.IMEReceiver; -import jp.axer.cocoainput.util.ModLogger; -import jp.axer.cocoainput.util.Rect; -import jp.axer.cocoainput.util.WrapperUtil; -import net.minecraft.world.level.block.StandingSignBlock; import net.minecraft.client.gui.Font; import net.minecraft.client.gui.screens.inventory.SignEditScreen; import net.minecraft.network.chat.TextComponent; +import net.minecraft.world.level.block.StandingSignBlock; public class SignEditScreenWrapper extends IMEReceiver { private SignEditScreen owner; @@ -17,7 +17,7 @@ public class SignEditScreenWrapper extends IMEReceiver { public SignEditScreenWrapper(SignEditScreen field) { - ModLogger.debug("SignEditScreen init: " + field.hashCode()); + ForgeLoader.getLoggerInstance().log("BookEditScreen init: " + field.hashCode()); owner = field; myIME = CocoaInput.getController().generateIMEOperator(this); myIME.setFocused(true); diff --git a/1.18.2/src/forge/resources/META-INF/accesstransformer.cfg b/1.18.2/forge/src/forge/resources/META-INF/accesstransformer.cfg similarity index 100% rename from 1.18.2/src/forge/resources/META-INF/accesstransformer.cfg rename to 1.18.2/forge/src/forge/resources/META-INF/accesstransformer.cfg diff --git a/1.18.2/src/forge/resources/META-INF/mods.toml b/1.18.2/forge/src/forge/resources/META-INF/mods.toml similarity index 100% rename from 1.18.2/src/forge/resources/META-INF/mods.toml rename to 1.18.2/forge/src/forge/resources/META-INF/mods.toml diff --git a/1.18.2/src/main/resources/cocoainput.mixins.json b/1.18.2/forge/src/forge/resources/cocoainput.mixins.json similarity index 100% rename from 1.18.2/src/main/resources/cocoainput.mixins.json rename to 1.18.2/forge/src/forge/resources/cocoainput.mixins.json diff --git a/1.18.2/src/forge/resources/pack.mcmeta b/1.18.2/forge/src/forge/resources/pack.mcmeta similarity index 100% rename from 1.18.2/src/forge/resources/pack.mcmeta rename to 1.18.2/forge/src/forge/resources/pack.mcmeta diff --git a/1.18.2/forge/wslgradlew b/1.18.2/forge/wslgradlew deleted file mode 100755 index 0b9b236..0000000 --- a/1.18.2/forge/wslgradlew +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/bash -cmd.exe /c 'SET JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-17.0.1.12-hotspot&gradlew '"$@" diff --git a/1.18.2/gradle/wrapper/gradle-wrapper.jar b/1.18.2/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000..e708b1c Binary files /dev/null and b/1.18.2/gradle/wrapper/gradle-wrapper.jar differ diff --git a/1.18.2/gradle/wrapper/gradle-wrapper.properties b/1.18.2/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 0000000..e750102 --- /dev/null +++ b/1.18.2/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,5 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists diff --git a/1.18.2/gradlew b/1.18.2/gradlew new file mode 100755 index 0000000..4f906e0 --- /dev/null +++ b/1.18.2/gradlew @@ -0,0 +1,185 @@ +#!/usr/bin/env sh + +# +# Copyright 2015 the original author or authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin or MSYS, switch paths to Windows format before running java +if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=`expr $i + 1` + done + case $i in + 0) set -- ;; + 1) set -- "$args0" ;; + 2) set -- "$args0" "$args1" ;; + 3) set -- "$args0" "$args1" "$args2" ;; + 4) set -- "$args0" "$args1" "$args2" "$args3" ;; + 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=`save "$@"` + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +exec "$JAVACMD" "$@" diff --git a/1.18.2/settings.gradle b/1.18.2/settings.gradle new file mode 100644 index 0000000..f889cf0 --- /dev/null +++ b/1.18.2/settings.gradle @@ -0,0 +1,13 @@ +pluginManagement { + repositories { + gradlePluginPortal() + maven { url = 'https://maven.fabricmc.net/' } + maven { url = 'https://maven.minecraftforge.net/' } + } +} + +rootProject.name = 'your-mod' + +include 'core' +include 'forge' +include 'fabric' diff --git a/1.18.2/src/fabric/java/jp/axer/cocoainput/loader/FabricLoader.java b/1.18.2/src/fabric/java/jp/axer/cocoainput/loader/FabricLoader.java deleted file mode 100644 index 6f0f500..0000000 --- a/1.18.2/src/fabric/java/jp/axer/cocoainput/loader/FabricLoader.java +++ /dev/null @@ -1,33 +0,0 @@ -package jp.axer.cocoainput.loader; - -import net.fabricmc.api.ClientModInitializer; -import net.fabricmc.fabric.api.client.screen.v1.ScreenEvents; -import jp.axer.cocoainput.CocoaInput; -import jp.axer.cocoainput.util.ModLogger; -import jp.axer.cocoainput.util.FCConfig; -import net.minecraft.client.gui.screens.Screen; - -public class FabricLoader implements ClientModInitializer { - public static FabricLoader instance; - public CocoaInput cocoainput; - @Override - public void onInitializeClient() { - FabricLoader.instance=this; - } - public void onWindowLaunched(){ - this.cocoainput=new CocoaInput("Fabric",null); - ModLogger.log("Fabric config setup"); - ModLogger.log("Config path:"+net.fabricmc.loader.api.FabricLoader.getInstance().getConfigDir().resolve("cocoainput.json").toString()); - FCConfig.init("cocoainput",net.fabricmc.loader.api.FabricLoader.getInstance().getConfigDir().resolve("cocoainput.json"), FCConfig.class); - CocoaInput.config=new FCConfig(); - ModLogger.log("ConfigPack:"+CocoaInput.config.isAdvancedPreeditDraw()+" "+CocoaInput.config.isNativeCharTyped()); - } - - public void onChangeScreen(Screen sc){ - if(this.cocoainput==null){ - this.onWindowLaunched(); - return; - } - this.cocoainput.distributeScreen(sc); - } -} diff --git a/1.18.2/src/forge/java/jp/axer/cocoainput/loader/ForgeLoader.java b/1.18.2/src/forge/java/jp/axer/cocoainput/loader/ForgeLoader.java deleted file mode 100644 index e8ca966..0000000 --- a/1.18.2/src/forge/java/jp/axer/cocoainput/loader/ForgeLoader.java +++ /dev/null @@ -1,41 +0,0 @@ -package jp.axer.cocoainput.loader; - -import jp.axer.cocoainput.CocoaInput; -import jp.axer.cocoainput.util.ModLogger; -import jp.axer.cocoainput.util.FCConfig; -import net.minecraftforge.client.event.ScreenOpenEvent; -import net.minecraftforge.common.MinecraftForge; -import net.minecraftforge.eventbus.api.SubscribeEvent; -import net.minecraftforge.client.ConfigGuiHandler; - -import net.minecraftforge.fml.ModList; -import net.minecraftforge.fml.ModLoadingContext; -import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.fml.event.lifecycle.FMLCommonSetupEvent; -import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; -import net.minecraftforge.fml.loading.FMLPaths; - -@Mod("cocoainput") -public class ForgeLoader { - private CocoaInput instance; - - public ForgeLoader(){ - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup); - MinecraftForge.EVENT_BUS.register(this); - - } - - private void setup(final FMLCommonSetupEvent event) { - this.instance=new CocoaInput("MinecraftForge",ModList.get().getModFileById("cocoainput").getFile().getFilePath().toString()); - ModLogger.log("Forge config setup"); - ModLogger.log("Config path:"+FMLPaths.CONFIGDIR.get().resolve("cocoainput.json").toString()); - FCConfig.init("cocoainput",FMLPaths.CONFIGDIR.get().resolve("cocoainput.json"), FCConfig.class); - ModLoadingContext.get().registerExtensionPoint(ConfigGuiHandler.ConfigGuiFactory.class, ()->new ConfigGuiHandler.ConfigGuiFactory((mc,modListScreen)->new FCConfig().getScreen(modListScreen))); - CocoaInput.config=new FCConfig(); - ModLogger.log("ConfigPack:"+CocoaInput.config.isAdvancedPreeditDraw()+" "+CocoaInput.config.isNativeCharTyped()); - } - @SubscribeEvent - public void didChangeGui(ScreenOpenEvent event) { - this.instance.distributeScreen(event.getScreen()); - } -} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/CocoaInput.java b/1.18.2/src/main/java/jp/axer/cocoainput/CocoaInput.java deleted file mode 100644 index 118d937..0000000 --- a/1.18.2/src/main/java/jp/axer/cocoainput/CocoaInput.java +++ /dev/null @@ -1,98 +0,0 @@ -package jp.axer.cocoainput; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.zip.ZipEntry; -import java.util.zip.ZipFile; - -import org.apache.commons.io.IOUtils; - -import com.sun.jna.Platform; - -import jp.axer.cocoainput.arch.darwin.DarwinController; -import jp.axer.cocoainput.arch.dummy.DummyController; -import jp.axer.cocoainput.arch.win.WinController; -import jp.axer.cocoainput.arch.x11.X11Controller; -import jp.axer.cocoainput.plugin.CocoaInputController; -import jp.axer.cocoainput.util.ConfigPack; -import jp.axer.cocoainput.util.ModLogger; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.Screen; - -public class CocoaInput { - private static CocoaInputController controller; - private static String zipsource; - public static ConfigPack config = ConfigPack.defaultConfig; - - public CocoaInput(String loader, String zipfile) { - ModLogger.log("Modloader:" + loader); - CocoaInput.zipsource = zipfile; - try { - if (Platform.isMac()) { - CocoaInput.applyController(new DarwinController()); - } else if (Platform.isWindows()) { - CocoaInput.applyController(new WinController()); - } else if (Platform.isX11()) { - CocoaInput.applyController(new X11Controller()); - } else { - ModLogger.log("CocoaInput cannot find appropriate Controller in running OS."); - CocoaInput.applyController(new DummyController()); - } - ModLogger.log("CocoaInput has been initialized."); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static double getScreenScaledFactor() { - return Minecraft.getInstance().getWindow().getGuiScale(); - } - - public static void applyController(CocoaInputController controller) throws IOException { - CocoaInput.controller = controller; - ModLogger.log("CocoaInput is now using controller:" + controller.getClass().toString()); - } - - public static CocoaInputController getController() { - return CocoaInput.controller; - } - - public void distributeScreen(Screen sc) { - if (CocoaInput.getController() != null) { - CocoaInput.getController().screenOpenNotify(sc); - } - } - - public static void copyLibrary(String libraryName, String libraryPath) throws IOException { - InputStream libFile; - if (zipsource == null) {//Fabric case - libFile = CocoaInput.class.getResourceAsStream("/" + libraryPath); - } else { - try {//Modファイルを検出し、jar内からライブラリを取り出す - ZipFile jarfile = new ZipFile(CocoaInput.zipsource); - libFile = jarfile.getInputStream(new ZipEntry(libraryPath)); - } catch (FileNotFoundException e) {//存在しない場合はデバッグモードであるのでクラスパスからライブラリを取り出す - ModLogger.log("Couldn't get library path. Is this debug mode?'"); - libFile = ClassLoader.getSystemResourceAsStream(libraryPath); - } - } - File nativeDir = new File(Minecraft.getInstance().gameDirectory.getAbsolutePath().concat("/native")); - File copyLibFile = new File( - Minecraft.getInstance().gameDirectory.getAbsolutePath().concat("/native/" + libraryName)); - try { - nativeDir.mkdir(); - FileOutputStream fos = new FileOutputStream(copyLibFile); - copyLibFile.createNewFile(); - IOUtils.copy(libFile, fos); - fos.close(); - } catch (IOException e1) { - ModLogger.error("Attempted to copy library to ./native/" + libraryName + " but failed."); - throw e1; - } - System.setProperty("jna.library.path", nativeDir.getAbsolutePath()); - ModLogger.log("CocoaInput has copied library to native directory."); - } -} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinController.java b/1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinController.java deleted file mode 100644 index 06f68b5..0000000 --- a/1.18.2/src/main/java/jp/axer/cocoainput/arch/darwin/DarwinController.java +++ /dev/null @@ -1,36 +0,0 @@ -package jp.axer.cocoainput.arch.darwin; - -import java.lang.reflect.Field; - -import jp.axer.cocoainput.CocoaInput; -import jp.axer.cocoainput.plugin.CocoaInputController; -import jp.axer.cocoainput.plugin.IMEOperator; -import jp.axer.cocoainput.plugin.IMEReceiver; -import jp.axer.cocoainput.util.ModLogger; -import net.minecraft.client.gui.screens.Screen; - -public class DarwinController implements CocoaInputController { - public DarwinController() throws Exception { - CocoaInput.copyLibrary("libcocoainput.dylib", "darwin/libcocoainput.dylib"); - Handle.INSTANCE.initialize(CallbackFunction.Func_log, CallbackFunction.Func_error, CallbackFunction.Func_debug); - ModLogger.log("DarwinController has been initialized."); - } - - @Override - public IMEOperator generateIMEOperator(IMEReceiver ime) { - return new DarwinIMEOperator(ime); - } - - - @Override - public void screenOpenNotify(Screen gui) { - try { - Field wrapper = gui.getClass().getField("wrapper"); - wrapper.setAccessible(true); - if (wrapper.get(gui) instanceof IMEReceiver) - return; - } catch (Exception e) {/* relax */} - Handle.INSTANCE.refreshInstance();//GUIの切り替えでIMの使用をoffにする - - } -} diff --git a/1.18.2/src/main/java/jp/axer/cocoainput/util/ConfigPack.java b/1.18.2/src/main/java/jp/axer/cocoainput/util/ConfigPack.java deleted file mode 100644 index a2a0a04..0000000 --- a/1.18.2/src/main/java/jp/axer/cocoainput/util/ConfigPack.java +++ /dev/null @@ -1,18 +0,0 @@ -package jp.axer.cocoainput.util; - -public interface ConfigPack { - - public static ConfigPack defaultConfig = new ConfigPack() { - @Override - public boolean isAdvancedPreeditDraw() { - return true; - } - @Override - public boolean isNativeCharTyped() { - return true; - } - }; - - public boolean isAdvancedPreeditDraw(); - public boolean isNativeCharTyped(); -} diff --git a/libcocoainput/win/Makefile b/libcocoainput/win/Makefile index a70942a..13d8717 100644 --- a/libcocoainput/win/Makefile +++ b/libcocoainput/win/Makefile @@ -1,4 +1,4 @@ -CC = gcc.exe +CC = gcc CFLAGS = -Wall -fPIC FFLAGS = OBJS = libwincocoainput.o logger.o